2017-04-18 119 views
0

如果我使用铛3.8.1编译:是铿锵++忽略外部“C”的一些弃用警告?

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还是我做错了什么?

+0

这与C无关! – Olaf

+2

该代码仍然是C++代码! 'extern“C”'只是指定了ABI和命名约定。 (你甚至读过警告吗?) – Olaf

+1

'extern“C”'只影响外部名称的链接 - 它不会将编译器更改为'C-mode'。 –

回答

7

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

+1

查看它的另一种方式:它意味着“该函数的**名称**使用C语言”,而不是** body **。 –

+0

@JohnZwinck - 它可能涉及的不仅仅是名称。 –

+1

@JohnZwinck:不完全。它也意味着C调用约定。 – Olaf

0

也许错误与extern "C"无关?它看起来好像不是说“寄存器与C不兼容”,而是“寄存器与C++ 1z不兼容”。 (我假设C++ 1x表示C++ 11/14/17。)