在C语言中的宏定义pragma中插入双引号

3

我正在尝试用C语言编写宏,以便创建正确的#pragma声明。

_pragma(section .BLOCK1) //Correct but deprecated
_pragma(section ".BLOCK1") //Correct without warning

以下代码可以运行,但编译器会给出警告(弃用声明):

#define DO_PRAGMA(x) _Pragma(#x)

#define PRAGMA(number) \
DO_PRAGMA(section .BLOCK##number)

PRAGMA(1)

我该如何在宏中包含双引号? 我已经尝试插入 "\"", 但是由于字符串直接被解释,所以它不起作用。

2个回答

2
您可以将此传递给帮助器宏,该宏会展开并将参数字符串化。
#define _stringify(_x)  #_x

#define DO_PRAGMA(a) _Pragma(_stringify(a))

#define PRAGMA(number) \
    DO_PRAGMA(section _stringify(.BLOCK##number))

你好,感谢您提供的信息。编译器没有返回任何错误,但是如果我尝试使用printf打印结果字符串,我会得到以下字符串 section _stringify(.BLOCK123)(Eclipse的宏扩展也会返回相同的结果)。我不确定这是否正确(也许编译器可以在第二步中解决它)。 - Andrea
您可以使用 gcc -E 命令检查扩展。 - ensc
@Andrea,这应该可以工作,PRAGMA(1) 应该能展开为 _Pragma("section \".BLOCK1\""),所以我认为这就是你需要的。 - anastaciu
@Andrea,如果这个答案帮助你解决了问题,请不要忘记点赞或接受它。 - anastaciu

1

给宏添加双引号的正确方式是使用反斜杠,即:

#define STRING "\"string\""

"string"现在存储在STRING中。

要将数字连接到宏字符串中,您可以做类似的事情,但需要将其存储在非const字符数组中:

#define STRING "section \".BLOCK%d\""
#define CONV(str, n) sprintf(str, STRING, n)
//...
char str [50];
CONV(str, 1);
DO_PRAGMA(str);
//...

如果您还没有查看,请检查pragma文档此使用示例

你好,是的,正如我所写的,我已经尝试过了,但它不起作用,因为宏DO_PRAGMA会将其文字字面上解释。我已经检查了文档,但在我的情况下没有帮助,因为我的字符串不是固定的,而是需要由宏(参见##运算符)解析。 - Andrea
@Andrea,我添加了一个选项,可以将数字连接到宏中,虽然不完全相同,但请检查是否符合您的需求。 - anastaciu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接