为了纠正错别字,并添加我忘记提及的问题,这里是宏:
#define SUFFIX .new
#define STR(x) #x
#define GENFILE(name,suff) STR(timings/name suff)
GENFILE(test1, SUFFIX)
上面的代码生成timings/test1 .new
,如果我没有额外的空间,我会得到我想要的,我该如何解决?
为了纠正错别字,并添加我忘记提及的问题,这里是宏:
#define SUFFIX .new
#define STR(x) #x
#define GENFILE(name,suff) STR(timings/name suff)
GENFILE(test1, SUFFIX)
上面的代码生成timings/test1 .new
,如果我没有额外的空间,我会得到我想要的,我该如何解决?
更简单:只要说#define GENFILE(name) STR(timings/name)
.
斜杠分隔预处理器标记,因此GENFILE(test1)
变成STR(timings/test1)
了作为一个整体进行字符串化的标记。
(现在你可以说#include GENFILE(myheader)
。)
或者,您可以说 #define GENFILE(name) STR(timings/) #name
,但这会导致两个连接的字符串 "timings/" "test1"
。请注意,正如@hvd 正确观察到的那样,字符串连接不能在#include
指令内部使用。
没有单一的标记(如果你愿意,可以称之为“单词”)/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
在将其包含在字符串中之前进行扩展。