我在Linux Mint 17.2机器上的Netbeans中有一个c++项目。我正在使用GCC 5工具链(例如g++ 5.3.0), Netbeans 8.1和Boost 1.61.0。
我在我的项目中遇到了一个奇怪的警告,它到处显示。例如,在main.cpp中,I #include <iostream>
位于最顶端,这一行会收到警告。(我看到这个警告发生在我在每个文件中包含的第一个文件,所以它是而不是与iostream等的问题)。
警告是boost中存在递归#include
。具体来说,Netbeans抱怨<boost/predef/os/bsd/free.h>
包括<boost/predef/os/bsd.h>
, <boost/predef/os/bsd.h>
包括<boost/predef/os/bsd/free.h>
。为了记录,这似乎是真的-有人知道为什么在boost中有这个递归包含,如果它真的应该在那里吗?
更大的问题是我的系统不是BSD,所以我不知道为什么我从BSD头中得到这些警告,它不应该被包含或激活/定义。我尝试从main.cpp中打印BOOST_PLATFORM_CONFIG
,它打印出boost的Linux配置头的路径,正如预期的那样-而不是BSD配置头。而且,我的程序编译和运行良好,所以我假设它从来没有真正使用BSD头文件。这意味着这些BSD头给我警告的事实可能是Netbeans问题,而不是boost问题。
有没有人有关于如何缩小和修复这些奇怪的递归包含警告的问题的任何想法?
我也有同样的问题。问题是boost predef/os/bsd.h头。它在#else块中包含5个文件,用于#ifndef BOOST_PREDEF_OS_BSD_H保护。这意味着如果这5个文件中的任何一个也包含bsd.h(它们确实包含bsd.h),则该头文件不会防止递归。
我的解决方案是编辑predef/os/bsd.h文件,并在#else块中添加递归保护-因此,从第94行开始,我的predef/os/bsd.h文件现在看起来像:#ifndef BOOST_PREDEF_OS_BSD_H_PREVENT_RECURSION <-- ADD THIS
#define BOOST_PREDEF_OS_BSD_H_PREVENT_RECURSION <-- ADD THIS
#include <boost/predef/os/bsd/bsdi.h>
#include <boost/predef/os/bsd/dragonfly.h>
#include <boost/predef/os/bsd/free.h>
#include <boost/predef/os/bsd/open.h>
#include <boost/predef/os/bsd/net.h>
#endif <-- ADD THIS
现在netbeans代码帮助是快乐的,我的代码仍然链接和编译没有错误。
简写:comment
#include <boost/predef/os/bsd.h>
无处不在(应该在以下头文件中)
-
predef/os.h
-
predef/other/endian.h