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 函数将相关代码嵌入到调用处。不在调用函数的地方跳转。
- [c/c++]宏定义,#,##
- [c/c++]宏定义,#,##
- [c/c++]宏定义,#,##
- c语言宏定义
- C 宏定义详解
- C中的宏定义
- C宏定义使用
- C 宏定义备忘
- C 宏定义
- C语言宏定义
- c 宏定义
- C/C++宏定义
- c语言宏定义
- C 宏定义小结
- C:宏定义 zz
- c语言宏定义
- C语言宏定义
- C 宏定义详解
- Android中的进程和线程
- Handler Looper Messagequeue Thread关系
- angular中控制器之间的传值该怎么实现?
- 关于库存表的设计
- git常用命令
- c宏定义
- 对于大流量的网站,采用什么样的方法来解决访问量问题
- 低级错误:Caused by: java.lang.ClassNotFoundException: Didn't find class "android.support.v4.view.ViewPag
- UNIX 环境高级编程(一) apue.h 文件与apue.3e的安装
- 【2016】五月份英语学习总结
- 学会编写Android Studio插件 别停留在用的程度了
- java基本类型的初始值
- owin 返回json字符串多带了双引号"多了重string转义字符串解决办法
- 判断NSString 是否为数字