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

Nic*_*ckB 1 c sizeof

我确信有时候有充分的理由把sizeof()作为C中的#define,但我偶尔会遇到一些错误,其中有人将sizeof()作为#define而不是sizeof()作为一个结构(在我的codebase我不需要把sizeof()作为#define).

例如(做作,但希望说明一点):

typedef struct my_struct
{
  fields
} MY_STRUCT;

#define MY_DEFINE 1234
my_size = sizeof(MY_DEFINE);  // Should be sizeof(MY_STRUCT)
Run Code Online (Sandbox Code Playgroud)

是否有任何简单,自动化的方式来捕捉这个?

谢谢你的帮助.NickB

AnT*_*AnT 6

好吧,不.宏是宏.如果宏替换的结果是有效的表达式(或类型),则代码将编译.编译器不知道你想做什么.

可能对你有帮助的一件事是,在这个特定的例子中,你想要sizeof一个类型而不是sizeof一个表达式.如果你的编码标准坚持总是通过struct标签来完成它,就像在

sizeof(struct my_struct)
Run Code Online (Sandbox Code Playgroud)

那么你的例子中的特定错误就不太可能出现意外错误.虽然其他错误不会.

你可以用一个以某种方式需要一个类型的宏来替换你的大小(并且在任何地方使用它代替普通的sizeof).例如像这样的东西

#define SIZE_OF_TYPE(T) ((T *) 0, sizeof(T))
Run Code Online (Sandbox Code Playgroud)

将无法使用非类型参数进行编译.但它也无法使用某些类型参数进行编译.

实际上我不知道你的背景,但总的来说整个想法似乎适得其反.一个好的编程实践实际上是避免应用于sizeof类型,而是更喜欢将它应用于表达式,如

int *p = malloc(n * sizeof *p); /* good */
Run Code Online (Sandbox Code Playgroud)

代替

int *p = malloc(n * sizeof(int)); /* bad */
Run Code Online (Sandbox Code Playgroud)

而你似乎想要朝着相反的方向前进.