我确信有时候有充分的理由把sizeof()作为C中的#define,但我偶尔会遇到一些错误,其中有人将sizeof()作为#define而不是sizeof()结构(在我的代码库中,我不需要将sizeof()作为#define)。
例如(设计,但希望说明一点):
typedef struct my_struct
{
fields
} MY_STRUCT;
#define MY_DEFINE 1234
my_size = sizeof(MY_DEFINE); // Should be sizeof(MY_STRUCT)
是否有任何简单,自动的方式来捕获它?
感谢您的帮助。 NickB
答案 0 :(得分:6)
嗯,不。宏是宏。如果宏替换的结果是有效的表达式(或类型),则代码将编译。编译器不知道你想做什么。
有一件事可能会对你有所帮助(或者没有),在这个具体的例子中你想要sizeof
一个类型而不是表达式的sizeof
。如果您的编码标准坚持始终通过struct标签执行,如
sizeof(struct my_struct)
然后像你的例子中的特定错误那样意外错误的可能性会降低。虽然其他错误不会。
你可能会用一个以某种方式需要一个类型的宏来替换你的大小(并在任何地方使用它代替普通的sizeof
)。比如像这样的东西
#define SIZE_OF_TYPE(T) ((T *) 0, sizeof(T))
将无法使用非类型参数进行编译。但它也无法使用某些类型参数进行编译。
实际上我不知道你的背景,但总的来说整个想法似乎适得其反。一个好的编程习惯实际上是避免将sizeof
应用于类型,而是更喜欢将其应用于表达式,如
int *p = malloc(n * sizeof *p); /* good */
而不是
int *p = malloc(n * sizeof(int)); /* bad */
而你似乎想要朝着相反的方向前进。
答案 1 :(得分:2)
为什么在typedef名称中使用ALL CAPS? typedef是C语言构造,而不是C预处理器构造。它是一个标识符,就像任何其他标识符一样。
如果您只使用MACRO的所有大写字母,那么在您使用它们时会非常明显。