我想在 clang 中使用 typeof 但不是__typeof__。如果我使用 typeof 而不声明它,我会收到以下警告
vector.c:14:5: warning: extension used [-Wlanguage-extension-token]
vec_init(&a,5);
^
./vector.h:27:26: note: expanded from macro 'vec_init'
((vec_ptr)->data) = (typeof((vec_ptr)->data)) malloc((capacity) * (sizeof((*((vec_ptr)->data))))) \
^
1 warning generated.
Run Code Online (Sandbox Code Playgroud)
然后我认为定义它可能会解决这个问题,所以我添加了以下代码:
#ifndef typeof
#ifdef __clang__
#define typeof(x) __typeof__(x)
#endif
#endif
Run Code Online (Sandbox Code Playgroud)
添加预处理器定义后,出现以下错误:
In file included from vector.c:1:
./vector.h:5:9: warning: keyword is hidden by macro definition [-Wkeyword-macro]
#define typeof(x) __typeof__(x)
^
1 warning generated.
Run Code Online (Sandbox Code Playgroud)
但如果我使用__typeof__它,则不会出现错误。如何解决 clang 上的这个警告问题?
在发布这个答案时,这不是typeof一个标准功能,而是一个实验性的语言扩展。因此,如果您坚持使用它,请意识到您不是在编写标准 C,并会收到严格编译器的相应警告。
然而,typeof曾经是一个 GNU 扩展,但它将包含在 C23 中。尽管编译器对将其添加到严格标准 C 的支持仍然不稳定(当编译为 时,clang 15 和 gcc 12.2 都不允许这样做-std=c2x)。
无论哪种方式,typeof都不是预处理器#define而是关键字,因此您不能将它与#ifndef.
目前,您可以使用 clang 或 gcc 进行编译-std=gnu2x,直到编译器支持 C23。但你仍然无法编译,-pedantic否则你会收到使用扩展的警告。
小智 5
任何时候你想停用警告,只需向编译器提供一个标志,上面写着-Wno-[warning-name]
在你的情况下:
-Wno-language-extension-token
另外,请不要试图用聪明的代码来掩盖这一点,要么你承认警告并保持你的代码标准化,要么你仍然承认它但停用它。
这样,如果有人在启用所有警告的情况下使用您的代码,他们仍然会收到您正在使用扩展的警告。
| 归档时间: |
|
| 查看次数: |
1508 次 |
| 最近记录: |