c宏定义

来源:互联网 发布:电影里翻译软件 编辑:程序博客网 时间:2024/05/07 16:15
#define  FIND(struc,a) (unsigned int)&(((struc*)0)->a)//(struc*)0表示把0强制转化为struc * 型指针指向的地址#define  SECOND_PER_YEAR  (60*60*24*356)UL//因为16位机器上int 将溢出,加上UL#define  MIN(a,b)  ((a)<(b)?(a):(b))//注意加括号,因为#define是直接嵌入到程序中const int bufsize = 1;//cost在C中是外联,c++中是内联//c中不能把const看成一个常量char cA[bufsize];//C++中正确,c中不正确const int bufsize;//c中正确,C++中不正确,c++中添加extern把内联转换为外联extern const int bufsize;const int bufsize = 2;struct  student{    int a;    int b;    char c[20];    int d;};int _tmain(int argc, _TCHAR* argv[]){    int sie = (int)&(((student*)0)->d);    int size = FIND(student,d);    return 0;}



mutable这部分是转的
原地址:http://no001.blog.51cto.com/1142339/389840/

mutable的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词。

  在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。

  我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的。但是,有些时候,我们需要在const的函数里面修改一些跟类状态无关的数据成员,那么这个数据成员就应该被mutalbe来修饰。

  下面是一个小例子:

class ClxTest{ public:  void Output() const;};void ClxTest::Output() const{ cout << "Output for test!" << endl;}void OutputTest(const ClxTest& lx){ lx.Output();}

  类ClxTest的成员函数Output是用来输出的,不会修改类的状态,所以被声明为const的。

  函数OutputTest也是用来输出的,里面调用了对象lx的Output输出方法,为了防止在函数中调用其他成员函数修改任何成员变量,所以参数也被const修饰。

  如果现在,我们要增添一个功能:计算每个对象的输出次数。如果用来计数的变量是普通的变量的话,那么在const成员函数Output里面是不能修改该变量的值的;而该变量跟对象的状态无关,所以应该为了修改该变量而去掉Output的const属性。这个时候,就该我们的mutable出场了——只要用mutalbe来修饰这个变量,所有问题就迎刃而解了。
下面是修改过的代码:

class ClxTest{ public:  ClxTest();  ~ClxTest();  void Output() const;  int GetOutputTimes() const; private:  mutable int m_iTimes;};ClxTest::ClxTest(){ m_iTimes = 0;}ClxTest::~ClxTest(){}void ClxTest::Output() const{ cout << "Output for test!" << endl; m_iTimes++;}int ClxTest::GetOutputTimes() const{ return m_iTimes;}void OutputTest(const ClxTest& lx){ cout << lx.GetOutputTimes() << endl; lx.Output(); cout << lx.GetOutputTimes() << endl;}

  计数器m_iTimes被mutable修饰,那么它就可以突破const的限制,在被const修饰的函数里面也能被修改。



结构体大小:
在默认情况下,为了方便对结构体内元素的访问和管理,当结构体内的元素的长度都小于处理器位数的时候,以最长数据为对齐单位,结构体的长度一定是最长元素的整数倍。
如果存在长度大于处理器位数的元素,就以处理器位数为对齐单位。

结构体内类型相同的连续元素将在连续的空间内,和数组一样。
struct stud
{
char a[2];
char c[2];
int d;
};

sizeof(stud) = 8

struct stud
{
char a[2];
int b;
char c[2];

};

sizeof(stud) = 12

struct stud
{
char a[2];
int b;
char c[2];

};

sizeof(stud) = 12

struct stud
{
char a[5];
int c;

};

sizeof(stud) = 6

struct stud
{
char a[2];
char b;
char c[2];
};

sizeof(stud) = 5

class A{
static int a;
int b;
};

sizeof (A) = 4
静态变量存在全局数据区


sizeof和strlen的区别。
sizeof是个操作符,大部分编译器在编译时计算,看某种类型的变量在内存中所占用的单元字节。
strlen是个函数 strlen只能用char*做参数,切必须是以“\0“结尾,在运行的时候才能计算出来。



对于宏#define来说,第一规则是绝对不去使用它,除非不得不这样做。

宏是在代码处不加任何验证的替代

内联inline 函数将相关代码嵌入到调用处。不在调用函数的地方跳转。

0 0
原创粉丝点击