GCC 警告已声明但未定义的变量
GCC warn about declared but undefined variable
我从these questions得知,如果我在头文件中声明一个静态常量变量:
Foo
{
public:
static const int BAR = 1234;
...
};
我还必须在源文件中定义它:
const int Foo::BAR;
但是,如果该变量没有在程序中使用,gcc 会很高兴地忽略这个要求。此外,如果启用了优化,gcc 似乎很高兴地掩盖了一些简单的用途(例如,通过 const 引用传递给 std::min)。
如果我忘记提供定义,即使我的源代码中没有使用该变量,是否有办法强制 gcc 发出警告?如果上面的 Foo
是共享库的一部分并且没有提供 Foo::BAR
的定义,用户将无法通过引用传递 Foo:BAR
或获取指向它的指针,但我作为图书馆作者没有得到任何迹象表明这是一个问题。
更一般地说,有没有办法强制共享库中的所有声明都有相应的定义?或者这是否会在优化机会方面牺牲太多而不值得?
你用语言标签标记了这个问题,所以...代码在技术上是合法的,因为标准只需要在最终程序中使用时的定义。编译器不知道您是否要 link 反对另一个定义符号的翻译单元,因此即使生成警告也很棘手,并且可能会产生误报。
检查的简单方法是正确地对您的库接口进行单元测试(如评论中所建议的那样),然后您会在 link 单元测试时确定。
我从these questions得知,如果我在头文件中声明一个静态常量变量:
Foo
{
public:
static const int BAR = 1234;
...
};
我还必须在源文件中定义它:
const int Foo::BAR;
但是,如果该变量没有在程序中使用,gcc 会很高兴地忽略这个要求。此外,如果启用了优化,gcc 似乎很高兴地掩盖了一些简单的用途(例如,通过 const 引用传递给 std::min)。
如果我忘记提供定义,即使我的源代码中没有使用该变量,是否有办法强制 gcc 发出警告?如果上面的 Foo
是共享库的一部分并且没有提供 Foo::BAR
的定义,用户将无法通过引用传递 Foo:BAR
或获取指向它的指针,但我作为图书馆作者没有得到任何迹象表明这是一个问题。
更一般地说,有没有办法强制共享库中的所有声明都有相应的定义?或者这是否会在优化机会方面牺牲太多而不值得?
你用语言标签标记了这个问题,所以...代码在技术上是合法的,因为标准只需要在最终程序中使用时的定义。编译器不知道您是否要 link 反对另一个定义符号的翻译单元,因此即使生成警告也很棘手,并且可能会产生误报。
检查的简单方法是正确地对您的库接口进行单元测试(如评论中所建议的那样),然后您会在 link 单元测试时确定。