通过将宏与字符串连接来构造固定字符串

Construct fixed string by concatenating macro with string

我已经回答了很多类似的问题并且几乎可以解决问题,但还不够。

我拥有的是标准的宏扩展字符串化方法。

#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,这也不是我想要的

我没主意了。

这是一个替代方案:

#define QUOTEME(M)    #M
#define COMPOSE(A, B) QUOTEME(A) #B

#define SW_PREFIX     XY2Ar-
#define SW_FILE       COMPOSE(SW_PREFIX, update)

有时我总是发现自己忘记了 KISS 原则......而正是在这些时候它显示出来了。

#define SW_PREFIX   "XY2Ar-"
#define SW_FILE     SW_PREFIX"update"

这些简单的行,没有进一步扩展或任何 return 所需的输出。 至于这样做的原因:

因为那里没有任何 #,所以它将 SW_PREFIX 扩展为 "XY2Ar-" 并向其附加 "update",结果是 "XY2Ar-""update" ,对于编译器,它与 XY2Ar-update.

相同

感谢删除答案的人提醒我。

您的想法似乎太复杂了:-) 不要创建单个标记来进行字符串化。只需对单独的部分使用字符串连接。

$ 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";