1

我敢肯定有时在 C 中使用 sizeof() a #define 是有充分理由的,但我偶尔会遇到有人使用 sizeof() a #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)

有什么简单、自动化的方法来捕捉这个吗?

谢谢你的帮助。尼克B

4

2 回答 2

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 */

你似乎想朝相反的方向前进。

于 2009-11-06T16:38:04.153 回答
2

为什么你在你的 typedef 名称中使用全部大写?typedef 是一种 C 语言结构,与 C 预处理器结构相反。它是一个标识符,就像任何其他标识符一样。

如果您只对 MACRO 使用所有大写字母,那么在使用它们时会非常明显。

于 2009-11-06T16:46:44.480 回答