为什么我会根据标题顺序获得c ++编译警告

时间:2016-04-30 21:17:33

标签: c++ c gcc header

我正在使用编译标志-Wall -Wextra和-Werror。当我编译以下文件时,我得到了大量的“声明'静态',但从未定义[-Werror = unused-function]”警告(视为错误)。当我颠倒#include指令的顺序时,没有这样的警告。请帮我理解原因?

我知道我可以删除额外的警告和错误并让我的程序编译,显然这不是我的意图或我的代码会更有趣。我正在努力获得更深入的C ++知识,并通过清理代码中的警告来改善我的习惯。

据我所知,argp实际上是一个C库,而iostream是一个C ++库,也许这就是问题的一部分。我很乐意使用一个合适的C ++库来完成argp所做的事情,但我找不到一个。如果有的话,我会很高兴听到它。

#include <argp.h>
#include <iostream>

int main(int argc, char **argv)
{
  return 0;
}

要清楚,我正在研究一个非平凡的程序,并且有特定的理由想要使用C ++而不是C.我已经将这里显示的代码简化为尽可能少的代码以产生效果我'我想了解。请不要建议我不需要其中一个或另一个标题。

编译器:gcc

    :~/scratch/argp_example$ gcc --version
gcc (Ubuntu 5.2.1-23ubuntu1~12.04) 5.2.1 20151031 Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

编译器调用: g++ -o obj/main.o -c src/main.cpp -Wall -Wextra -Werror -pedantic -MMD --std=c++11 -Iinc

特定的编译器反馈:

    In file included from /usr/include/x86_64-linux-gnu/c++/5/bits/gthr.h:148:0,
                 from /usr/include/c++/5/ext/atomicity.h:35,
                 from /usr/include/c++/5/bits/ios_base.h:39,
                 from /usr/include/c++/5/ios:42,
                 from /usr/include/c++/5/ostream:38,
                 from /usr/include/c++/5/iostream:39,
                 from src/main.cpp:2:
/usr/include/x86_64-linux-gnu/c++/5/bits/gthr-default.h:101:1: warning: ‘int __gthrw_pthread_once(pthread_once_t*, void (*)())’ declared ‘static’ but never defined [-Wunused-function] __gthrw(pthread_once) ^

gthr.h还有很多类似的错误。这个特定的复制/粘贴来自没有-Werror的运行,但这是唯一的区别。

解: 这是我选择的解决方案,但当然,您可以简单地颠倒包含的顺序。这是一个公认的错误,因此没有“正确”的答案,所有解决方案都是解决方法。我认为,这个最不可能让我或其他人适合以后。

#include <argp.h>
#undef __attributes__
#include <iostream>
...

1 个答案:

答案 0 :(得分:4)

这是known bug。罪魁祸首是argp.h中的这一块代码,当您使用-std=c++xx时会触发该代码:

#ifndef __attribute__
/* This feature is available in gcc versions 2.5 and later.  */
# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__
#  define __attribute__(Spec) /* empty */
# endif

有争议的声明通常标有__attribute__ ((__weakref__("pthread_meow"))),但此宏导致该属性消失。

在修复错误之前,您可能希望使用-std=gnu++xx进行编译,或在包含#undef __attribute__后手动argp.h进行编译。