【发布时间】:2022-08-07 22:13:42
【问题描述】:
#define\ 的不包含空格的替换列表可以映射到整数(ID):
#define ID_double 1
#define ID_float 2
#define ID_long_double 3
#define ID_(x) ID_##x
#define ID(x) ID_(x)
#define T double
T v;
int x = ID(T); /* 1 */
现在考虑:
#define T long double
上面的代码不会编译:
<source>:3:25: error: \'ID_long\' undeclared here (not in a function)
问题:有没有办法支持空间?
例如(不知何故):
#define REPLACE_SPACES_TO_UNDERSCORES(x) ??
#define ID(x) ID_(REPLACE_SPACES_TO_UNDERSCORES(x))
#define T long double
T v;
int x = ID(T); /* 3 */
-
也许
_Generic可能有用? -
使用
typedef语句创建一个不包含空格的别名,即typedef long double long_double;,然后在宏中使用该别名。 -
@RemyLebeau 确实:除了
#define T long_double,还需要typedef long double long_double;。谢谢! -
@RemyLebeau 但是,您不能(?)
typedef long double long_double;通过编译器选项,而您可以通过编译器选项#define T long_double。现在考虑代码是只读的。那么如何在其中插入一个额外的typedef? -
GCC 知道选项
-include添加文件,因为它包含在#include中。
标签: c c-preprocessor