3

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

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

GENFILE(test1, SUFFIX)

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

4

2 回答 2

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指令内部使用。

于 2012-09-19T13:31:09.000 回答
4

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

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

#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在将其包含在字符串中之前进行扩展。

于 2012-09-19T13:31:47.843 回答