【发布时间】:2019-06-14 19:01:29
【问题描述】:
我正在编译一个非常基本的程序,试图从-Wunused-member-function 触发输出。
test.cpp:
#include <iostream>
class A {
public:
void foo() { std::cout << "Called foo" << std::endl; }
void foo_unused() { std::cout << "Unused foo" << std::endl; }
};
int main() {
A obj;
obj.foo();
return 0;
}
以下命令的输出
clang++ -std=c++17 -Wall -Wunused -Wunused-member-function \
-Wunused-function -Wunneeded-member-function \
test.cpp -o 测试
不幸的是,甚至没有包含一个警告。我希望编译器会警告foo_unused 未被使用。
我在这里错过了不同的行为吗?不然clang为什么不抱怨没有使用的成员函数呢?
【问题讨论】:
-
因为它是公开的?尝试将其设为私有
-
如果您将
void foo_unused()设为私有 - 它会按预期工作。由于foo_unused是公共类成员(类型接口),这没有任何问题。编译器/链接器会在进行dead code elimination优化时简单地删除它。 -
问题是公共方法可以在任何地方使用。所以没有办法在一个编译单元中检查它。它需要在链接阶段完成,而不是编译阶段。
-
@Adam 根据 C++,当您定义一个类(结构、联合)时 - 您定义的是一个类型,而不是这种类型的对象(如
A obj;)。所以按照C++语言A类是完全正确的,因为A类型没有错。 -
@VictorGubin,不,私人不会改变任何东西:godbolt.org/z/TM8GdYbe8
标签: c++ clang compiler-warnings