我正在使用編譯標誌-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>
...
這是一個奇怪的問題。也許你可以將解析限制在一個單獨的模塊中,並且*不包括那個iostream? – wallyk
看起來是一個給定的GNU錯誤:http://stackoverflow.com/questions/7969419/nvcc-cuda-3-1-ghtr-default-h-flood-of-declared-static-but-not-defined- warnin –
至於替補,你檢查了[Boost.Program_options](http://www.boost.org/doc/libs/1_60_0/doc/html/program_options.html)嗎? –