【问题标题】:Is clang++ ignoring extern "C" for some deprecation warnings?clang++ 是否忽略了一些弃用警告的 extern "C"?
【发布时间】:2017-09-14 10:33:24
【问题描述】:

如果我使用 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错误还是我做错了什么?

【问题讨论】:

  • 那与C无关!
  • 代码还是C++代码! extern "C" 只是指定 ABI 和命名约定。 (你甚至读过警告吗?)
  • extern "C" 仅对外部名称的链接有影响 - 它不会将编译器更改为“C 模式”。
  • 要么修复它,要么用 C 编译这部分 - 以任何有意义的方式。

标签: c++ multilingual clang++ extern-c


【解决方案1】:

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

【讨论】:

  • 另一种看待它的方式:它的意思是“这个函数的 name 在 C 中”,而不是 body
  • @JohnZwinck - 它可能涉及的不仅仅是名称。
  • @JohnZwinck:不完全是。它还暗示了 C 调用约定。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-27
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    相关资源
    最近更新 更多