1.下面的代码会有问题吗?
char* ptr = NULL;
printf("%s\n", ptr);
free(ptr);
查资料发现当ptr=NULL时free()函数是不做内存释放的,所以上面的程序不会出错。至于printf("%s\n", ptr);利用VS2008编译器输出的是(null),不知道其它编译器输出什么。
2.变量前的两个冒号(::)
int x = 5;
int main(int argc, char* argv[]){
int x = 3;
std::cout<<x<<' '<<::x<<std::endl;
}
输出的结果是“3 5”,如果去掉全局的定义"int x = 5;"它会报错说“x”: 不是“`global namespace'”的成员,所以觉的两个冒号::表示全局空间。
3. Win32平台下的微软C编译器(cl.exe for 80×86)的对齐策略:
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要,编译器会在最末一个成员之后加上填充字节(trailing padding)。
出处:http://blog.youkuaiyun.com/hilyoo/article/details/4464448
4. sizeof(TestClassSize)的输出结果?
class TestClassSize{
public:
virtual void fun(void){cout<<"fun"<<endl;}
virtual void fun2(void){};
private:
int t;
};
sizeof(TestClassSize)的输出结果为8,其中int t;占4byte;虚函数的个数无论一个或多个都只占4byte(如果有double类型的数据按3所述的对齐规则),因为虚函数是通过一张虚函数表(Virtual Table)来实现的,所以这里的4byte存放虚函数表的指针。
5.打印出当前源文件的文件名以及源文件的当前行号
cout << __FILE__ ;
cout<<__LINE__ ;
__FILE__和__LINE__是系统预定义宏,这种宏并不是在某个文件中定义的,而是由编译器定义的。
6.判断程序是否由c++编译程序编译的
#ifdef __cplusplus
//doing something
#endif