gpt4 book ai didi

c - 如何捕获 sizeof(#define) 形式的错误

转载 作者:太空宇宙 更新时间:2023-11-04 00:33:40 25 4
gpt4 key购买 nike

我确信在 C 中使用 sizeof() a #define 有时是有充分理由的,但我偶尔会遇到错误,其中有人使用 sizeof() a #define 而不是 sizeof() a 结构(在我的代码库中,我不需要使用 sizeof() #define。

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

typedef struct my_struct
{
fields
} MY_STRUCT;

#define MY_DEFINE 1234
my_size = sizeof(MY_DEFINE); // Should be sizeof(MY_STRUCT)

是否有任何简单、自动化的方法来捕获它?

感谢您的帮助。尼克B

最佳答案

嗯,不。宏就是宏。如果宏替换的结果是一个有效的表达式(或类型),那么代码将通过编译。编译器不知道你想做什么。

可能对您有帮助(或没有帮助)的一件事是,在这个特定示例中,您想要 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 */

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

关于c - 如何捕获 sizeof(#define) 形式的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1688679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com