20140319 const sizeof define 编译时分配内存
1、面试宝典预处理,const,sizeof
-
Define作用定义函数:
//用一个宏定义FIND求一个结构体struc里某个变量相对于struc的偏移量,如FIND(student,a)//等于0 FIND(student,b)//等于4 #include<stdio.h> #define FIND(strucrr,e) (unsigned int)&(((strucrr *)0)->e) struct student { double ccc; int a; char b; }; int main() { struct student A; printf("ccc的偏移地址为:%d\n",FIND(student,ccc)); printf("a的偏移地址为:%d\n",FIND(student,a)); printf("b的偏移地址为:%d\n",FIND(student,b)); printf("成员1地址:%x\n",&(A.ccc)); printf("成员2地址:%x\n",&(A.a)); printf("成员3地址:%x\n",&(A.b)); printf("结构体变量A所占内存%d\n",sizeof(A)); //结构体变量A所占内存空间始终大于结构的大小,原因是因为内存对齐 return 0; }
若出现以下错误,解决方案是:在项目属性->配置属性->清单工具->输入输出嵌入清单该“是”为“否”,即可解决问题
结果如下所示:
#include<stdio.h> #define MIN(A,B) (A>B?B:A) void main() {
int A=2; int B=1; printf("%d",MIN(A,B)); }
-
cosnt
关于书上说的“编译的时候分配内存” :http://www.cnblogs.com/helinsen/archive/2012/10/02/2710460.html
const作用http://blog.csdn.net/gulin20475/article/details/6747660
include和extern的关系
两种情况下:左边const相当于define,不分配内存,编译器经过类型检查后直接用100在编译时替换;右边是普通变量,分配内存;加extern就会分配内存
const变量默认是内部部链接,普通变量默认是外部链接
//test.cpp #include<stdio.h> const int r=100; //1处:普通变量默认就是extern,但是const是默认内部链接的,如果要外部连接必须加上extern extern void print(); void main() { print(); } test1.cpp #include<stdio.h> extern int r;//2处 extern void print() { printf("%d",r); }
会在链接时出现以下错误(编译正确):原因就是普通变量默认就是extern,但是const是默认内部链接的,如果要外部引用必须加上extern
所以1处修改为:extern const int r;同样会出现以上错误,这次的原因就在于2处的extern int r没加const。接着修改2处为extern const int r;成功!
cost 引用
什么情况下不能重载,什么情况下不能重载?
void f(int i) {......} file://一个函数
void f(int i) const {......} file://上一个函数的重载
关于函数overloading, 不能根据返回值类型来确定
double max( int a, int b);
int max( int a, int b);
也不能根据参数的默认值来判断
int max( int a, int b);
int max( int a, int b, int c=12);
const成员函数:
它的声明形如:
int f( ) const;//const放在函数的最后,编译器会对这个函数进行检查,在这个函数中的任何试图改变成员变量和调用非const成员函数的操作都被视为非法
//假如有一个叫做X的类,它有一个int成员变量r,我们需要通过一个const成员函数f( )来对这个r进行++r操作,代码如下
void X::f( ) const
{ (const_cast<X*>(this)) -> ++r; } //通过this指针进行类型强制转换实现
另外一种方法就是使用关键字:mutable。如果你的成员变量在定义时是这个样子的:
mutable int r ;
那么它就告诉编译器这个成员变量可以通过const成员函数改变。编译器就不会再理会对他的检查了。