C/C++语言一些宏的介绍

2 篇文章 0 订阅

一、#和##的用法:

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值