一、#和##的用法:
1.看下面第一个代码例子:
#define to_string(s) # s
cout << to_string(Hello World!) << endl;
有了第一个语句
#define to_string(s) # s
的声明的时候,编译器就会把
cout << to_string(Hello World!) << endl;
替换成下面语句:
cout << "Hello World!" << endl;
也就是说这个#符号的使用,是使得在#符号后面的第一个参数被作为一个包含在双引号内的字符串返回回去。
2.现在看第二个代码例子:
#define concatenate(x, y) x ## y
...
int xy = 10;
...
cout << concatenate(x, y) <<endl;
在第一个语句声明了之后,编译器运行到代码
cout << concatenate(x, y) << endl;
行时,就会把改行的concatenate(x, y)语句换成
cout << xy << endl;
也就是说,##符号的作用就是把##符号的前面的字符x和后面的字符y合并了起来,当然x和y也可以为字符串,
所以上面的语句会输出10。
二、#define的使用:
syntax:
#define macro-name replacement-string
#define 会把macro-name替换为replace-string
例如:
#define TRUE 1
#define FALSE 0
...
int done = 0;
while (done == TRUE) {
...
}
上面的TRUE 和FALSE就分别表示为1和0使用了。 再如:
#define max(a, b) ((a) > (b) ? (a) : (b))
int a = 1, b = 3;
int c = max(a, b);
cout << c << endl;
输出的结果就是:3
在使用#define语句的时候要非常小心,因为不注意可能会出现错误。看下面代码:
#define abs(x) (((x) < 0) ? -(x) : (x))
int a = -2;
cout << abs(++a) << endl;
cout << a << endl;
上面的程序会输出:1和1,因为#define 语句在预处理过程中只是简单的把两个字符串相替换,并没有进行语法之类的检查,也可能不是我们想要的目的。
所以在使用#define语句是一定要小心。
三、#include的使用:
syntax:
#include <filename>
#include "filename"
上面的两个语句都会搜索文件filename,并把文件内容夹在到这个语句出现的行,但是他们的区别就是:
1.加双引号的会比尖括号的优先被搜索
2.加双引号的会在当前的文件夹内搜索filename的文件,尖括号的是在标准库里面搜索。
四、#if, #ifdef,#ifndef, #else, #elif, #endif:
1.#if expression
如果expression的值为true,那么直接接在该语句后面的语句会被直接编译,否则不编译,直到出现#endif
2.#ifdef macro
如果之前已经#define macro了,那么直接接在该语句后面的语句会被直接编译,否则不编译,直到出现#endif
3.#ifndef macro
用法类似于#ifdef,如果之前已经没有#define macro了,那么直接接在该语句后面的语句会被直接编译,
否则不编译,直到出现#endif
这些可以用来使用在调试代码的时候会有很大帮助。
五、#line:
#line 与__LINE__ 和__FILE__ 两个参数有关,可以通过#line来修改这两个参数。
例如:
#line 100 "copy.c"
printf("the current line %d, current file %s\n", __LINE__, __FILE__);
这样子就会输出:the current line 100, current file copy.c
原本__LINE__ 和__FILE__是表示当前行和当前的文件,使用#line语句后可以对这两个参数进行修改。
当一个程序比较复杂,运行错误是,为了方便打印错误信息的行数和当前错误所在文件就可以使用__LINE__和__FILE__.
另外,还有可以用 __FUNCTION__ 输出当前函数名
__DATE__ 宏指令含有形式为月/日/年的串,表示源文件被翻译到代码时的日期,
__TIME__ 宏指令包含程序编译的时间(时间用字符串表示,其形式为: 分:秒)。
参考:
1.C/C++ Refrence
2.http://bbs.csdn.net/topics/320269615