2017-07-26 76 views
0

这似乎是一件小事,但我不是C++的专家,我还没有找到一个好的在线解决方案。我怀疑我错过了一些可能解决此问题的基本编码结构。我在我的主头文件一个如下定义:避免定义,但不使用静态常量类

static const Foo INVALID_FOO = {}; 

其中Foo是一个POD类(它不具有构造函数,因为它是在联合使用在C++ 03的项目)。这似乎很好,除了源,其中包括了头,但不使用INVALID_FOO,我收到了警告:

error: 'Foo::INVALID_FOO' defined but not used [-Werror=unused-variable] 

我试图消除static但后来我得到重复的定义。我可以将它作为前向声明,并将其定义在.c文件中,但编译器需要通过引用访问它,并且无法进行任何优化。我也想不要禁用-Wall编译器标志。我想知道是否有一个很好的方法来做到这一点?

+1

我不知道C++ 17的内联可以帮助吗? – Bathsheba

+0

您是否希望在每个[*翻译单元*](https://en.wikipedia.org/wiki/Translation_unit_(编程))中定义“INVALID_FOO”?为什么不简单地在头文件中声明*并在源文件中定义(它实际使用的地方)? –

+0

@Someprogrammerdude:我几乎按照“回答问题”的方式回答了这个问题,但我的印象是,OP意识到了这一点。 – Bathsheba

回答

3

可以抑制GCC警告这样的:

static const Foo INVALID_FOO __attribute__ ((unused)) = {}; 

注意unused是正确的在这里,它的作用是,它取消警告(和它仍然是细到引用标识符)。还有一个used属性,它禁止警告告诉GCC在目标文件中发出定义,即使编译器在源代码中没有看到对它的引用 - 在大多数情况下,这会导致不必要的代码膨胀。

+0

谢谢,这正是我正在寻找。 – blackghost

+1

小修正 - '__attribute __((unused))'必须在'='之前,否则会出现编译错误('expected,或;'__attribute __''之前)。可能是gcc版本的东西... – blackghost

+0

使用C++ 17也可以使用标准'[[maybe_unused]]'[attribute](http://en.cppreference.com/w/cpp/language/attributes)(或'[[gnu :: unused]]',因为GCC还不能识别'maybe_unused')。 –

0

您可以使用static_cast<void>(INVALID_FOO);声明来移除警告。

另请注意,static const在全局和命名空间范围有点重言 - const使它成为static,因此static是多余的。