【问题标题】:Clang -Wunused-const-variable in C vs. C++C 与 C++ 中的 Clang -Wunused-const-variable
【发布时间】:2017-04-10 01:50:42
【问题描述】:

只有一个 const 声明的文件,如下所示:

const int genericRC = 0;

当使用 clang C++ 前端编译时会警告这个未使用的变量。然而,clang C 前端却对此保持沉默:

$ cat x.sh
clang   -c src/x.c   -Wall -std=c11
clang++ -c src/t.cpp -Wall -std=c++11

$ ./x.sh
src/t.cpp:1:11: warning: unused variable 'genericRC' [-Wunused-const-variable]
const int genericRC = 0;
          ^
          1 warning generated.

对于这种类型的 const 静态作用域变量,C 与 C++ const 是否有任何根本区别,或者这只是一个警告,恰好在 clang C++ 前端实现,而不是在 C 前端实现。

【问题讨论】:

  • C 和 C++ 是不同的语言。为什么你期望相同的语法意味着相同的语义? const 是限定符,而不是范围。
  • @Olaf:我在这里没有看到任何期望,只有一个完全合理且恰当的问题。
  • @Olaf。因为这个陈述是如此简单,我没想到会有任何语言特定的语义。我知道 const 是一个限定符。我是说这个变量是静态作用域的(MM 下面的答案表明这个作用域假设实际上是这种特殊差异的根源)。
  • @BoundaryImposition:这个问题显然源于假设 C 和 C++ 对于相同的功能表现相同。
  • @PeeterJoot:至少 C 标准中没有“静态范围”。答案没有使用这个术语是有充分理由的。链接与范围非常不同。我可以建议您使用完善的标准术语吗?

标签: c++ c clang clang++


【解决方案1】:

在 C++ 中,它具有内部链接,因此编译器可以知道它未被使用。在 C 语言中,它具有外部链接,因此可能会被另一个翻译单元使用,因此警告为时尚早。

【讨论】:

  • 其实clang有这个问题,因为-Wunused-const-variable是-Wall的一部分。在我 30 岁的 C 代码中,有一个文件 globals.c 主要包含全局常量变量。这些通过所有文件包含的标头中的“extern”声明被拉入其他文件。 globals.c 通过#ifdef 省略这些行。但是,由于某些变量仅由其他文件使用,而不是在 globals.c 本身内部,因此它错误地认为它们是“未使用的”,并在尝试使用 C++ 编译(以使事物现代化)时抛出一个合适的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多