如何捕获表单sizeof(#define)的错误

时间:2009-11-06 16:25:41

标签: c sizeof

我确信有时候有充分的理由把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

2 个答案:

答案 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的所有大写字母,那么在您使用它们时会非常明显。