使用预处理器语法获取const char

时间:2012-09-19 13:25:08

标签: c macros c-preprocessor stringification

要纠正错别字,并添加我忘记提及的问题,这是宏:

#define SUFFIX .new
#define STR(x) #x
#define GENFILE(name,suff) STR(timings/name suff)

GENFILE(test1, SUFFIX)

上面的代码会生成timings/test1 .new,如果我没有那个额外的空间,我会得到我想要的,我该如何解决这个问题?

2 个答案:

答案 0 :(得分:6)

更简单:只需说#define GENFILE(name) STR(timings/name)

斜杠将预处理器标记分开,因此GENFILE(test1)变为STR(timings/test1),整个字符串化。

(现在你可以说#include GENFILE(myheader)。)


或者,您可以说#define GENFILE(name) STR(timings/) #name,但这会产生两个连接的字符串"timings/" "test1"。请注意,正如@hvd正确地观察到的那样,字符串连接不能在#include指令中使用。

答案 1 :(得分:4)

没有单一的标记(如果你愿意,可以称之为“单词”)/test1/test1是除法运算符/后跟标识符test1,它们不能一起添加。幸运的是,你不需要。如果它们一起出现而没有任何插入空格,并且您将其字符串化,则不会插入空格。所以只需删除##

还要确保您的宏参数名称与您在定义中使用的名称相匹配。 testnamename不一样。

#define STR(x) #x
#define FILE(testname) STR(timings/testname)

<强>更新

由于您已编辑过您的问题,因此上述内容不再是完整的答案。

您获得空间是因为您在宏定义中包含了一个空格,并且您需要重写宏定义以不包含空格。一种方法是使用这样的额外宏:

#define SUFFIX .new
#define STR(x) STR_(x)
#define STR_(x) #x
#define ID(x) x
#define GENFILE(name,suff) STR(timings/ID(name)suff)
GENFILE(test1, SUFFIX) // expands to "timings/test1.new"

请注意,STR宏现在还需要一个额外的辅助宏,以允许ID在将其包含在字符串中之前进行扩展。