在宏体里定义局部变量的.参看wikipedia macros
下面讨论C语言中的宏.
谈到宏,不得不提到preprocess directives(预处理指令).预处理指令是预处理器在
预处理阶段所要执行的操作.具体在宏中就是执行宏替换功能.基本的一个就是#define.
好,现在先谈谈宏的定义.
宏就是处理输入和输出的规则.所以更直观的一点就是带个输入参数.
#define ADD(foo) foo+10
bar.c #define ADD(foo) foo+10 int main() { ADD(3); return 0; }
int main() { 3+10; return 0; }
更常见的定义宏的方式就是没有输入(即没有参数),比如,
#define PI 3.14
注意,很多人在调试的时候使用__FUNCTION__(gcc扩展)或者__func__(C99标准),这两个都
不是宏,应为在预处理阶段根本无法确认函数.
宏定义需要注意的问题
1.宏是预处理阶段的替换(expansion),不进行计算,所以要时刻把()加上.
拿上面定义的一个例子来看:
bar.c #define ADD(foo) foo+10 int i = 2 * ADD(3);
语句会被替换成:
int i = 2 * foo+10;
#define ADD(foo) (foo+10)
#define MUL(foo, egg) foo*egg MUL(2+3,4+5);
#define MUL(foo, egg) ((foo) * (egg))
2.宏是否可以用来定义注释.
#define HEAD_COMMENT /* #define END_COMMENT */
Preprocessor(预处理器),在计算机科学中指的是一个处理代码输入并且把输出做为另外
一个程序输入的程序,它也是一个程序.参看:wikipedia preprocessor
GNU的预处理器可以处理C/C++/Objective-c,因为都和C沾边(或者就是从开始遗留下来的
习惯)所以就叫C PreProcessor(cpp 不是c plus plus:-) )
CPP处理预处理指令,有#include,#define(undef),#if(ifdef,ifndef,else if,elif,endif),#error
,#line, #pragma,#,##,当然预处理也处理注释(comment),而且优先于预处理指令.
1.文件包含(file inclusion)
#include指令
#include <stdio.h> 从标准路径搜索stdio.h #include "nids.h" 从当前目录开始搜索nids.h如果找不到再到命令行参数指定的目录寻找 最后是标准目录下寻找.
3.条件编译(conditinal compilation)
#if __STDC__ == 1 #if defined FREEBSD #if !defined FREEBSD #endif #ifdef FREEBSD #else if #define LINUX #endif
#line 299 "ip.c" 下一行是ip.c的299行 #line 299 下一行是本文件的299行
#define tempfile(dir) #dir "/%s" tempfile(/usr/tmp)被扩展成 "/usr/tmp" "/%s",也就是 "/usr/tmp/%s"
#define xstr(s) str(s) #define str(s) #s #define foo 4 str (foo) 由于有#,表示参数首先被字符串化,所以不再有任何扩展. → "foo" xstr (foo) 没有#,所以参数被扩展. → xstr (4) → str (4) → "4"
解释:
s is stringified when it is used in str, so it is not macro-expanded first. But
s is
an ordinary argument to xstr, so it is completely macro-expanded before xstr
itself is
expanded . Therefore, by the time str gets to its argument, it has already been macro-expanded.
#define cat(x,y) x##y cat(2,3) 扩展为23 cat(wolf,python) 扩展为wlfpython