通过将宏与字符串连接来构造固定字符串
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";
我已经回答了很多类似的问题并且几乎可以解决问题,但还不够。
我拥有的是标准的宏扩展字符串化方法。
#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";