要纠正错别字,并添加我忘记提及的问题,这是宏:
#define SUFFIX .new
#define STR(x) #x
#define GENFILE(name,suff) STR(timings/name suff)
GENFILE(test1, SUFFIX)
上面的代码会生成timings/test1 .new
,如果我没有那个额外的空间,我会得到我想要的,我该如何解决这个问题?
答案 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
,它们不能一起添加。幸运的是,你不需要。如果它们一起出现而没有任何插入空格,并且您将其字符串化,则不会插入空格。所以只需删除##
。
还要确保您的宏参数名称与您在定义中使用的名称相匹配。 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
在将其包含在字符串中之前进行扩展。