C预处理器指令运算符##

C预处理器指令运算符##,c,c-preprocessor,C,C Preprocessor,我想在纯C中创建一个函数void vec2_from_vec3(vec2 res,vec3 from),使用操作符#,如下所示: #define MAGIC_MACROS(n) \ void vec##(n-1)##_from_vec##n##(vec##(n-1) res, vec##n from); 但编译器不会让它发生。可能吗 受启发,预处理器不会计算n-1,它只会对其进行扩展。例:3-1,因此字符串串联将不起作用 (一个现代的编译器会这么做,但已经太晚了) 你总是可以做那些还没那么糟糕

我想在纯C中创建一个函数
void vec2_from_vec3(vec2 res,vec3 from)
,使用操作符
#
,如下所示:

#define MAGIC_MACROS(n) \
void vec##(n-1)##_from_vec##n##(vec##(n-1) res, vec##n from);
但编译器不会让它发生。可能吗


启发,预处理器不会计算n-1,它只会对其进行扩展。例:
3-1
,因此字符串串联将不起作用

(一个现代的编译器会这么做,但已经太晚了)

你总是可以做那些还没那么糟糕的事情:

#define MAGIC_MACROS(n1,n2) \
void vec##n1##_from_vec##n2##(vec##n1 res, vec##n2 from)
并用作:

MAGIC_MACROS(2,3);

请注意,不应以
结束宏,因此它与函数调用是同构的,不会破坏编辑器的自动缩进。

此外,我想创建
typedef int16_t vec3i[3]
,使用
#define INT_BITS 16
然后
#define LINMATH_define_VECI(n,b)typedef INT##b#t vec#n#并调用
LINMATH\u H\u DEFINE\u VECI(3,整数位)
。但它变为
类型定义初始位向量3i[3]
。这也不可能,对吧?不可能,因为同样的原因:preproc只替换一次。您必须通过
(3,16)