在宏中为C中的pragma插入双引号

在宏中为C中的pragma插入双引号,c,macros,pragma,C,Macros,Pragma,我试图在C中创建一个宏,以便创建正确的pragma声明 _pragma(section .BLOCK1) //Correct but deprecated _pragma(section ".BLOCK1") //Correct without warning 以下代码正在运行,但编译器给了我一个警告(不推荐的声明): 如何在宏中包含双引号? 我已经尝试过插入“\”,但它不起作用,因为字符串是直接解释的。向宏添加双引号的正确方法确实是使用反斜杠,即: #define STR

我试图在C中创建一个宏,以便创建正确的pragma声明

_pragma(section .BLOCK1) //Correct but deprecated
_pragma(section ".BLOCK1") //Correct without warning
以下代码正在运行,但编译器给了我一个警告(不推荐的声明):

如何在宏中包含双引号?
我已经尝试过插入“\”,但它不起作用,因为字符串是直接解释的。

向宏添加双引号的正确方法确实是使用反斜杠,即:

#define STRING "\"string\""
“字符串”
现在存储在
string

要将数字连接到宏字符串中,可以执行以下操作,但需要将其存储在非常量字符数组中:

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

如果还没有,请选中并。

您可以将其传递给助手宏,该宏将展开并字符串化参数

\define\u stringify(\ux)\ux
#定义DO_PRAGMA(a)_PRAGMA(_stringify(a))
#定义PRAGMA(数字)\
DO_PRAGMA(段字符串化(.BLOCK##编号))

您好,是的,正如我写的那样,我已经尝试过了,但它不起作用,因为宏DO#PRAGMA按字面意思执行。我已经检查了文档,但对我来说没有帮助,因为我的字符串不是固定的,而是由宏解析的(请参阅##运算符)@Andrea,我添加了一个选项,将一个数字连接到宏中,虽然不完全相同,但检查它是否符合您的需要。您好,谢谢您,编译器没有返回任何错误,但是如果我尝试使用printf打印结果字符串,我会得到以下字符串
部分\u stringify(.BLOCK123)
(Eclipse的宏扩展也会返回相同的结果)。我不确定这是否正确(也许编译器可以在第二步中解决它)。您可以使用
gcc-E
@Andrea检查扩展,这应该有效,
PRAGMA(1)
应该扩展到
\u PRAGMA(“section\”.BLOCK1\”)
所以我认为这就是你需要的。@Andrea,如果答案有助于你解决问题,别忘了投票和/或接受。
#define STRING "section \".BLOCK%d\""
#define CONV(str, n) sprintf(str, STRING, n)
//...
char str [50];
CONV(str, 1);
DO_PRAGMA(str);
//...