C++ 为什么我得到c++;根据标题顺序编译警告

C++ 为什么我得到c++;根据标题顺序编译警告,c++,c,gcc,header,C++,C,Gcc,Header,我正在使用编译标志-Wall-Wextra和-Werror。编译以下文件时,我收到大量“声明为‘静态’,但从未定义[-Werror=unused function]”警告(视为错误)。当我颠倒#include指令的顺序时,没有这样的警告。请帮我理解为什么 我知道我可以删除额外的警告和错误,让我的程序编译,显然这不是我的意图,否则我的代码会更有趣。我试图通过C++来加深对C++的了解,并通过清理代码中的警告来改善我的习惯。 我知道ARGP确实是一个C库,而IoSt流是C++库,也许这是问题的一部分

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

我知道我可以删除额外的警告和错误,让我的程序编译,显然这不是我的意图,否则我的代码会更有趣。我试图通过C++来加深对C++的了解,并通过清理代码中的警告来改善我的习惯。 <>我知道ARGP确实是一个C库,而IoSt流是C++库,也许这是问题的一部分。我很乐意使用一个合适的C++库来完成ARGP的操作,但是我找不到。如果有,我很乐意听到

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

int main(int argc, char **argv)
{
  return 0;
}
编译器调用:
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的顺序。这是一个公认的错误,因此没有“正确”的答案,所有的解决方案都是变通办法。我认为,这件衣服最不可能在以后给我或其他人穿上

#include <argp.h>
#undef __attributes__
#include <iostream>
...
#包括
#未定义属性__
#包括
...
这是一个。罪魁祸首是
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
\ifndef\uu属性__
/*此功能在gcc版本2.5及更高版本中可用*/
#如果uuu GNUC_uuu<2 | |(uuu GNUC_uuuu==2&&uuu GNUC_u小调uuu<5)| | u__
#定义_属性_(规范)/*空*/
#恩迪夫
有争议的声明通常用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu


在修复错误之前,您可能希望使用
-std=gnu++xx
进行编译,或者在包含
argp.h

之后手动执行
\undef\uuu属性
,这是一个奇怪的问题。也许您可以将解析限制在单个模块中,而不将iostream包含在该模块中?鉴于此,看起来是一个GNU错误:至于替代,您检查过了吗?@AndrewHenle我确实读过,并承认这是一个类似的问题,但我不明白它在那个问题上说这是一个GNU错误。这个问题对硬件和库有很多具体的问题,这些问题与我的问题无关,所以我认为我可能会更有效地回答一个更广泛的问题,因为我没有足够的理解力。如果你正在编写C++代码,使用C++编译器,像
g++
而不是像
gcc
那样的C编译器。既然你写C++代码,请删除<代码> C <代码>标签。你能建议如何最好地搜索这样的已知bug吗?教一个人钓鱼。。。?我在谷歌上运气不好。@Jfevold好吧,我首先找出了原因,然后搜索它是否是一个已知的问题。使用
g++-E
对两个版本的代码进行预处理,检查有什么不同(
\uuuu属性((\uuuu weakref\uuuuuu(“…”))
消失),然后检查是什么导致了它(argp.h定义了一个
\uu属性\uuuuuu
宏),然后通过谷歌查看这是否是一个已知问题(这是
argp.h\uuu属性的顶级结果之一)。
#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