我想使用这样的宏参数:
#define D(cond,...) do{ \
#if cond \
#define YYY 1 \
#else \
#define YYY 0 \
} while(0)
Run Code Online (Sandbox Code Playgroud)
是否可以?
UPD
也许当源将被预处理两次时:gcc -E source.c | gcc -xc -下一步将起作用:
#define D(cond,...) #define YYY cond&DEBUG
#if YYY
#define D(...) printf( __VA_ARGS__ )
#else
#define D(...)
#endif
Run Code Online (Sandbox Code Playgroud)
不,因为C 2011 [N1570] 6.10.3.4 3说,关于宏替换, \xe2\x80\x9c 生成的完全宏替换的预处理标记序列不会被处理为预处理指令,即使它类似于一个,\xe2\x80\ xa6\xe2\x80\x9d
\n这不可能。阅读有关GNUcpp预处理器和 C11 标准(即n1570)的信息,并在此处查看。在C预处理器(概念至少)编译器的其余部分(其获取之前运行预处理的形式翻译单元)。顺便说一句,对于foo.c您可以使用gcc -C -E foo.c > foo.i(使用GCC)进入foo.i其预处理形式的文件,您可以检查它 -foo.i因为它是一个文本文件 - 使用寻呼机或编辑器。
然而,一个.c 可被生成的文件(产生C语言代码是一种常见的做法,自1980年代以来至少;例如与YACC,野牛,的rpcgen,痛饮,....;许多大型软件项目使用专门的C或C ++代码生成……)。您可能会考虑使用其他一些工具,可能是GPP预处理器(或GNU m4)或其他一些程序或脚本,来生成您的 C 文件(从其他东西)。也看看autoconf(它可能有与你相似的目标)。
您可能希望为此目的配置您的构建自动化工具,例如编辑您Makefile的GNUmake .
不,这是不可能的。
在翻译期间,所有预处理指令(#define、等)都会在任何宏扩展发生之前#include执行,因此如果宏扩展为预处理指令,它不会被这样解释 - 它将被解释为(无效)源代码。