如何在 clang 编译器中使用 typeof 而不发出警告?

Pra*_*tic 2 c clang

我想在 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 上的这个警告问题?

Lun*_*din 6

在发布这个答案时,这不是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

另外,请不要试图用聪明的代码来掩盖这一点,要么你承认警告并保持你的代码标准化,要么你仍然承认它但停用它。

这样,如果有人在启用所有警告的情况下使用您的代码,他们仍然会收到您正在使用扩展的警告。