在引用的字符串中扩展宏变量

ami*_*n__ 10 c string macros c-preprocessor

我在c中的两本着名书籍中发现了两个不同的东西,第一个是"宏观扩展中的引用字符串中没有替换形式参数" - 由K&R c语言第76页

第二个是代码,

#define PRINT(var,format) printf("variable is %format\n",var)
PRINT(x_var,f);
Run Code Online (Sandbox Code Playgroud)

稍后的宏调用将扩展为

printf("x_var is %f\n",x_var);
Run Code Online (Sandbox Code Playgroud)
  • 这是通过在第448页的ansi c - E. balagurusamy编程.

当然有两个引用是相互矛盾的.到目前为止,我知道第一个是真的,我的编译器给我的结果如此.但第二本书也是众所周知和受欢迎的.我想知道在先前版本的c中是否有这样的东西,或者第二次引用是假的.

das*_*ght 20

第二本书是错误的:很容易检查宏不会像那样扩展.但是,您可以使用预处理器运算符通过对标记进行字符串化来获得它们描述的效果#:

#define PRINT(var,format) printf(#var" is %"#format"\n",var)
Run Code Online (Sandbox Code Playgroud)

现在您可以按如下方式打印变量:

int xyz = 123;
PRINT(xyz, d);
Run Code Online (Sandbox Code Playgroud)

这是一个关于ideone的工作示例的链接.

请注意在'#format'之前和之后添加双引号,在'var'和'format'之前添加'#'.'#'运算符使变量的值成为带引号的字符串 - 带有双引号.这使得替换的字符串成为一行中的四个带引号的字符串,C编译器将其识别为连接成一个字符串的请求.因此字符串:"xyz","is%","d"和"\n"连接成:"xyz is%d \n"

(注意,此示例与原始问题中的示例的不同之处在于,orignal示例具有"variable is ...",其中答案将'variable'替换为'var'宏参数的实例)