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

时间:2015-12-14 10:23:47

标签: c macros c-preprocessor stringification

我已经完成了许多类似的问题,几乎让它起作用,但并不完全。

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

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

我没有想法。

3 个答案:

答案 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相同。

感谢那个为了提醒我而删除答案的人。