1

如果我使用 clang 3.8.1 编译:

extern "C" {
int foo(int x) { register int y = x; return y; }
}

int main() { return foo(123); }

我收到警告:

a.cpp:3:18: warning: 'register' storage class specifier is deprecated and incompatible with C++1z [-Wdeprecated-register]
int foo(int x) { register int y = x; return y; }
                 ^~~~~~~~~

...我真的不应该得到这个,因为内部函数是 C 代码。如果我使用 GCC 6.3.1,即使使用-Wall,我也不会收到此警告。

这是一个clang错误还是我做错了什么?

4

2 回答 2

8

extern "C"并不意味着“将此代码编译为 C”。它的意思是“使这个函数(或函数)可以从 C 代码中调用”,这通常意味着改变名称修饰,有时,调用约定。

于 2017-04-18T14:16:46.987 回答
0

也许错误与extern "C"? 看起来它说的不是“寄存器与 C 不兼容”,而是“寄存器与 C++1z 不兼容”。(我假设 C++1x 意味着 C++11/14/17。)

于 2018-01-03T03:34:53.737 回答