例如,以下是可能的:
#define definer(x) #define #x?
在定义中,pound (#
) 符号有不同的含义。它的意思是-如果这是一个参数,通过引用它使它成为一个字符串。
你不能嵌套 C 预处理器指令。幸运的是,它几乎从来没有必要。如果你真的需要那种能力,那么在将代码交给 C 编译器之前,你几乎肯定会更好地运行另一个预处理器。例如:
sed 's/@CUSTOMER@/J. Random Person/' foo.c.in > foo.c
cc foo.c
另一个有用的技巧是将欺骗隔离到单个头文件中,该头文件由您自己编写的程序生成:
./generate-trickery --greet 'J. Random Person' > foo.h
其中 foo.h 将看起来像这样:
#define GREET(x) ("J. Random Person greets you, " #x)
如果你把这个与 Makefile 或其他一些自动化联系在一起,它将是非常无缝的,不会绊倒你的开发。
不你不能这么做.
您可以从另一个宏引用一个宏,但不能从另一个宏定义一个宏。
如果您试图创建一段可以多次调用以执行稍微不同的事情的预处理器代码,则可以执行此操作的一种(适度糟糕)方法是将代码隔离到单个.h
文件中,然后将其#include
多次。这个想法是,每次#include
文件都会引用您正在“调用您的例程”的文件 / i-您首先通过传递参数
我看到这很有用的一个地方是生成“智能”枚举,这些枚举可以转换为 / 从它们的“字符串化”形式(这对 I / O 很有用)。
ENUMVAL(foo)
ENUMVAL(bar)
ENUMVAL(baz)
然后#include
此文件两次:一次是在ENUMVAL()
以创建enum
声明的方式定义,一次是在ENUMVAL()
以产生字符串名称数组的方式定义。通过这种方式,您不需要多次指定实际令牌列表。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处
评论列表(2条)