2016-04-30 63 views
3

我正在使用編譯標誌-Wall -Wextra和-Werror。我在編譯以下文件時遇到了「聲明爲'靜態'的泛洪,但從未定義過[-Werror = unused-function]」警告(視爲錯誤)。當我顛倒#include指令的順序時沒有這樣的警告。請幫我理解爲什麼?爲什麼根據標題順序獲取C++編譯警告

我知道我可以刪除額外的警告和錯誤,並讓我的程序編譯,顯然這不是我的意圖,或者我的代碼會更有趣。我試圖獲得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. 

編譯invokation: 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.很多很多類似的錯誤這個特定的複製/粘貼來自沒有錯誤的運行,但這是唯一的區別。

SOLUTION: 這是我選擇的解決方案,但當然,您可以簡單地顛倒包含的順序。這是一個公認的錯誤,所以沒有「正確的」答案,所有的解決方案都是解決方法。我認爲,這個最不可能在稍後給我或其他人。

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

這是一個奇怪的問題。也許你可以將解析限制在一個單獨的模塊中,並且*不包括那個iostream? – wallyk

+0

看起來是一個給定的GNU錯誤:http://stackoverflow.com/questions/7969419/nvcc-cuda-3-1-ghtr-default-h-flood-of-declared-static-but-not-defined- warnin –

+0

至於替補,你檢查了[Boost.Program_options](http://www.boost.org/doc/libs/1_60_0/doc/html/program_options.html)嗎? –

回答

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進行編譯,或者在包含argp.h後手動編譯#undef __attribute__

+0

你能否建議如何最好地搜索這樣的已知錯誤?教一個人去釣魚...?我沒有在谷歌上運氣。 – Jfevold

+0

@Jfevold嗯,我首先找出是什麼原因造成的,然後搜索它是否是已知問題。使用'g ++ -E'來預處理這兩個版本的代碼,檢查有什麼不同('__attribute__((__weakref __(「...」)))''不見了),然後檢查是什麼導致它(argp.h定義了一個' __attribute__'宏),然後谷歌,看看這是一個已知的問題(這是'argp.h __attribute__'的最高結果之一。 –