我已经完成了许多类似的问题,几乎让它起作用,但并不完全。
我所拥有的是标准的宏扩展 - 字符串化方法。
#define QUOTEME(M) #M
#define DOQUOTE(M) QUOTEME(M)
#define XCONCAT(X, Y) X##Y
#define CONCAT(X, Y) XCONCAT(X, Y)
然后我有一个像这样的宏PREFIX
:
#define SW_PREFIX XY2Ar-
我想做的是:
#define SW_FILE DOQUOTE(CONCAT(SW_PREFIX, update))
这应该输出的内容是:"XY2Ar-update"
它在我的GCC类型编译器上输出的是:
error: pasting "-" and "update" does not give a valid preprocessing token
现在,我假设他正在正确地替换宏,但由于update
显然不希望将XY2Ar-
追加到-
。
我也尝试过:
#define SW_FILE DOQUOTE(SW_PREFIX.update)
再次,它几乎完成了我想要的,但它输出
XY2Ar-.update
,这不是我想要的。
我没有想法。
答案 0 :(得分:3)
这是另一种选择:
#define QUOTEME(M) #M
#define COMPOSE(A, B) QUOTEME(A) #B
#define SW_PREFIX XY2Ar-
#define SW_FILE COMPOSE(SW_PREFIX, update)
答案 1 :(得分:3)
你的想法似乎太复杂了:-)不要创建单个令牌来进行字符串化。只需将字符串连接用于单独的部分即可。
$ cat x.c
#define QUOTEME(M) #M
#define DOQUOTE(M) QUOTEME(M)
#define SW_PREFIX XY2Ar-
#define SW_FILE DOQUOTE(SW_PREFIX) QUOTEME(.update)
char *x = SW_FILE;
$ gcc -E x.c
# 1 "x.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "x.c"
char *x = "XY2Ar-" ".update";
答案 2 :(得分:1)
有时候我一直发现自己忘记了KISS原则......而且它的时间就像它显示的那样。
#define SW_PREFIX "XY2Ar-"
#define SW_FILE SW_PREFIX"update"
这些简单的线条,没有进一步的扩展或任何东西返回所需的输出。 至于它为什么这样做:
由于其中没有#
,因此会将SW_PREFIX
扩展为"XY2Ar-"
并向其添加“更新”,从而产生"XY2Ar-""update"
,编译器与XY2Ar-update
相同。
感谢那个为了提醒我而删除答案的人。