【发布时间】:2015-05-27 01:46:44
【问题描述】:
在 C11 库项目中,我有几个使用泛型在共享宏名称下公开的宏函数,如下所示:
#define signum(operand) _Generic( (operand), \
unsigned long long: __signum_i4, unsigned long: __signum_i3, unsigned int: __signum_i2, unsigned short: __signum_i1, unsigned char: __signum_i0, \
signed long long: __signum_i4, signed long: __signum_i3, signed int: __signum_i2, signed short: __signum_i1, signed char: __signum_i0, \
long double: __signum_f2, double: __signum_f1, float: __signum_f0, \
complex long double: __signum_c2, complex double: __signum_c1, complex float: __signum_c0 \
) (operand)
它们似乎工作得很好,但出于分析原因,我想为一些测试用例创建预处理源,以便我可以验证编译器是否选择了预期的泛型替换。但是,当使用 gcc -E 时,我会得到这样的半扩展输出:
assert(_Generic( (0LL), unsigned long long: __signum_i4, unsigned long: __signum_i3, unsigned int: __signum_i2, unsigned short: __signum_i1, unsigned char: __signum_i0, signed long long: __signum_i4, signed long: __signum_i3, signed int: __signum_i2, signed short: __signum_i1, signed char: __signum_i0, long double: __signum_f2, double: __signum_f1, float: __signum_f0, _Complex long double: __signum_c2, _Complex double: __signum_c1, _Complex float: __signum_c0 ) (0LL) == 0);
assert(_Generic( (+1LL), unsigned long long: __signum_i4, unsigned long: __signum_i3, unsigned int: __signum_i2, unsigned short: __signum_i1, unsigned char: __signum_i0, signed long long: __signum_i4, signed long: __signum_i3, signed int: __signum_i2, signed short: __signum_i1, signed char: __signum_i0, long double: __signum_f2, double: __signum_f1, float: __signum_f0, _Complex long double: __signum_c2, _Complex double: __signum_c1, _Complex float: __signum_c0 ) (+1LL) == +1);
...
我假设 _Generic 是一个预处理器功能,因此希望通用宏可以像这样完全扩展:
assert(__signum_i4(0LL) == 0);
assert(__signum_i4(+1LL) == +1);
assert(__signum_i4(-1LL) == -1);
...
有没有办法使用 gcc 标志来实现这一点?
【问题讨论】:
标签: c generics gcc c-preprocessor