GNU C有两个扩展,它提议使之成为安全的宏MAX
,MIN
并且只会对参数进行一次评估:typeof
和__auto_type
。给出两个MAX
演示每个宏的示例:
#define MAX(a, b) ({ \
typeof(a) _a = (a); \
typeof(b) _b = (b); \
_a > _b ? _a : _b; \
})
#define MAX(a, b) ({ \
__auto_type _a = (a); \
__auto_type _b = (b); \
_a > _b ? _a : _b; \
})
对于这两个问题是,typeof
并__auto_type
给出错误,如果它是对位的领域。此示例代码使用以下任一项显示位字段的问题MAX
:
#include <stdio.h>
#include <stdint.h>
// Insert one of the MAX macros here
struct bitfields {
uint8_t a: 4;
uint8_t b: 4;
};
int main(int argc, char *args[]) {
struct bitfields x = {12, 4};
printf("%d\n", MAX(x.a, x.b));
return 0;
}
GCC分别为typeof
和提供以下错误消息__auto_type
:
error: 'typeof' applied to a bit-field
error: '__auto_type' used with a bit-field initializer
因此,问题是:为什么GCC不允许将这些字段与位字段一起使用(我找不到关于它的任何文档),以及如何做一个MAX
宏来对仍然适用于任何类型的任何类型的参数仅计算一次的宏位字段?
您用于__typeof__(+(a))
根据默认促销获取促销类型。至少对type的位域有效int
。我不确定编译器如何处理较大的位域类型的类型,这些位域类型是实现定义的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句