C++ 是叮当声++;“忽略外部因素”;";对于一些弃用警告?
如果我使用clang 3.8.1编译:C++ 是叮当声++;“忽略外部因素”;";对于一些弃用警告?,c++,multilingual,clang++,extern-c,C++,Multilingual,Clang++,Extern C,如果我使用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
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
,我也不会收到此警告
这是一个叮当作响的bug还是我做错了什么?
extern“C”
并不意味着“将此代码编译为C”。它的意思是“使此函数(或多个函数)可从C代码调用”,这通常意味着更改名称混乱,有时还意味着调用约定。extern“C”
并不意味着“将此代码编译为C”。这意味着“使此函数(或多个函数)可从C代码调用”,这通常意味着更改名称混乱,有时还意味着调用约定。可能错误与外部“C”无关。?它看起来不是说“寄存器与C不兼容”,而是说“寄存器与C++1z不兼容”。(我假设C++1x表示C++11/14/17。)也许错误与外部“C”无关?它看起来不是说“寄存器与C不兼容”,而是说“寄存器与C++1z不兼容”。(我假设C++1x表示C++11/14/17。)这与C无关!代码仍然是C++代码!代码>外部“C”仅指定ABI和命名约定。(你读过警告了吗?extern“C”
只对外部名称的链接有效-它不会“将编译器更改为”C-mode“。要么修复它,要么用C编译此部分-无论哪个有意义。这与C无关!代码仍然是C++代码!代码>外部“C”仅指定ABI和命名约定。(你读过警告了吗?extern“C”
只对外部名称的链接有效-它不会“将编译器更改为”C-mode“。要么修复它,要么用C编译此部分-无论哪个有意义。另一种方式看它:它意味着“此函数的名称是C,”而不是身体。@JohnZwinck-它可能涉及的不仅仅是名字。@JohnZwinck:不完全是。它还意味着C调用约定。另一种看待它的方式是:它意味着“这个函数的名称在C中”,而不是主体。@JohnZwinck-它可能涉及的不仅仅是名称。@JohnZwinck:不完全是。它还暗示了C调用约定。