亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何打開(字面上)所有GCC警告?

如何打開(字面上)所有GCC警告?

C++
LEATH 2019-12-09 15:50:25
我真的要啟用GCC的所有警告。(您會認為這很容易...)您-Wall可能認為可以解決問題,但不能!還需要-Wextra。您-Wextra可能認為可以解決問題,但不能!并非所有此處列出的警告(例如-Wshadow)都已啟用。而且我仍然不知道這個清單是否全面。我如何告訴GCC啟用(如果不是,則不是,否則為?。┧芯??
查看完整描述

3 回答

?
料青山看我應如是

TA貢獻1772條經驗 獲得超8個贊

我同意先前的回答,即從字面上啟用所有警告可能無益,但是GCC確實提供了一種實現此目的的合理方便的方法。命令


gcc -Q --help=warning

提供所有受支持的警告選項的列表,以及有關它們是否處于活動狀態的信息。這可以通過方式來找出哪個選項(不)例如通過啟用-Wall和-Wextra


gcc -Wall -Wextra -Q --help=warning

要啟用所有警告,您可以使用一些正則表達式提取命令行參數


gcc -Q --help=warning | sed -e 's/^\s*\(\-\S*\)\s*\[\w*\]/\1 /gp;d' | tr -d '\n'

對于我當前的GCC,這給出了:


-Wabi -Wabi-tag -Waddress -Waggregate-return -Waggressive-loop-optimizations -Waliasing -Walign-commons -Wampersand -Warray-bounds -Warray-temporaries -Wassign-intercept -Wattributes -Wbad-function-cast -Wbool-compare -Wbuiltin-macro-redefined -Wc ++-compat -Wc ++ 0x-compat -Wc ++ 14-compat -Wc-binding-type -Wc90-c99-compat -Wc99-c11-compat -Wcast-align -Wcast-qual -Wchar下標-W字符截斷-Wchkp -Wclobbered -Wcomment -Wcompare-reals -W有條件支持-Wconversion -Wconversion-extra -Wconversion-null -Wcoverage-mismatch -Wcpp -Wctor-dtor-privacy -Wdate-time -Wdeclaration -聲明后-Wdelete不完整-Wdelete-non-virtual-dtor -Wdeprecated -Wdeprecated-clarifications -Wdesignated-init -Wdisabled-optimization -Wdiscarded-array-qualifiers -Wdiscarded-qualifiers -Wdiv-by-零-Wdouble-promotion -Weffc ++-虛空的身體-Wendif標簽-Wenum-compare -Wextra -Wfloat-equal -Wformat-contains-nul -Wformat-extra-args -Wformat-nonliteral -Wformat-security -Wformat-signness -Wformat-y2k -Wformat-zero-length -Wfree -非堆對象-Wfunction消除-Wignored限定詞-Wimplicit -Wimplicit函數聲明-Wimplicit-int -Wimplicit接口-Wimplicit-procedure -Wincompatible-pointer類型-Winherited-variadic-ctor -Winit-self -Winline -Wint轉換-Wint-pointer-cast -Wintrinsic-shadow -Wintrinsics-std -Winvalid-memory-model -Winvalid-offsetof -Winvalid-pch -Wjump-misses-init -Wline-truncation -Wliteral后綴-Wologic -非括號-Wologic-op -Wlong-long -Wmain -Wmay尚未初始化-Wmemset轉換后的參數-Wmissing括號-Wmissing-聲明-Wmissing-field-initializers -Wmissing-include-dirs -Wmissing-parameter-type -遺忘原型-Wmultichar -Wnarrowing -Wnested-externs -Wnoexcept -Wnon-template-friend -Wnon-virtual-dtor -Wnonnull -Wodr -Wold-style-cast -Wold-style-declaration -Wold-style-definition -Wopenmp-simd -Woverflow -Woverlength字符串-Woverloaded-virtual -Woverride-init -Wpacked -Wpacked-bitfield-compat -Wpapped -Wparentheses -Wpedantic -Wpmf-conversions -Wpointer-arith -Wpointer-sign -Wpointer-to-int-cast -Wpragmas -Wproperty -assign-default -Wprotocol -Wreal-q-constant -Wrealloc-lhs -Wrealloc-lhs-all -Wredundant-decls -Wreorder -Wreturn-local-addr -Wreturn-type -Wselector -Wsequence-point -Wshadow -Wshadow-ivar -Wshift計數負數-Wshift計數溢出-Wsign比較-Wsign促銷-Wsize釋放-Wsizeof數組參數-Wsizeof-pointer-memaccess -Wstack-protector -Wstrict-null-Sentinel -Wstrict-prototypes -嚴格選擇匹配-Wsuggest-屬性=常量-Wsuggest-屬性=格式-Wsuggest-屬性=不返回-Wsuggest-屬性=純-Wsuggest-最終方法-Wsuggest-最終類型-Wsuggest-override -Wsurprising -Wswitch -Wswitch-bool -Wswitch -default -Wswitch枚舉-Wsync-nand -Wsynth -Wsystem-headers -Wtabs -Wtarget-lifetime -Wtraditional -Wraditional-conversion -Wtrampolines -Wtrigraphs -Wtype-limits -Wondeclared-selector -Wundef -Wunderflow -Wuninitialized -Wunknown-pragmas -Wunsafe循環優化-Wunsuffixed浮點常量-Wunused -Wunused-但是設置參數-Wunused-但設置變量-Wunused-Dummy參數-Wunused函數-Wunused-label -Wunused-local-defs -無用的宏-無用的參數-無用的結果-無用的值-無用的變量-Wuse-without-only-無用的鑄造-Wvarargs -Wvariadic-macros -Wvector-operation-performance-Wvirtual-move-assign-Wvla -Wvolatile-register-var -Wwrite-strings -Wzero-null-pointer-constant -Wzerotrip -frequire-return-statement


現在可以用來呼叫GCC,即


gcc $(gcc -Q --help=warning | sed -e 's/^\s*\(\-\S*\)\s*\[\w*\]/\1 /gp;d' | tr -d '\n')

但是請注意,由于某些警告選項僅適用于某些語言(例如C++),因此會產生警告。可以通過使用更多的正則表達式來避免這些問題,以僅包括當前語言允許的選項,或者-Wno-whatever在通話結束時添加適當的選項。


查看完整回答
反對 回復 2019-12-09
?
天涯盡頭無女友

TA貢獻1831條經驗 獲得超9個贊

不可能在所有警告都啟用的情況下進行編程(除非您要忽略它們,否則為什么要打擾?)。例如,假設您使用以下標志集:-Wstrict-prototypes -Wtraditional。


即使啟用了兩個警告,以下程序也會抱怨。


/tmp $ cat main.c 

int main(int argc, char **argv) {

    return 0;

}

/tmp $ gcc -Wstrict-prototypes -Wtraditional main.c 

main.c: In function ‘main’:

main.c:1:5: warning: traditional C rejects ISO C style function definitions [-Wtraditional]

 int main(int argc, char **argv) {

     ^

您可能會認為“好吧,那我將使用舊樣式的原型”。不,這行不通。


/tmp $ cat main.c 

int main(argc, argv)

    int argc;

    char **argv;

{

    return 0;

}

/tmp $ gcc -Wstrict-prototypes -Wtraditional main.c 

main.c:1:5: warning: function declaration isn’t a prototype [-Wstrict-prototypes]

 int main(argc, argv)

     ^

不,不指定任何原型也是錯誤的,因為編譯器也會抱怨。


/tmp $ cat main.c 

int main() {

    return 0;

}

/tmp $ gcc -Wstrict-prototypes -Wtraditional main.c 

main.c:1:5: warning: function declaration isn’t a prototype [-Wstrict-prototypes]

 int main() {

     ^

如果在程序中定義任何函數,則不能使用所有標志,因為編譯器會抱怨任何可想像的函數定義。


對于C ++,這是可能的(該-Wtraditional標志不存在),并且可以編譯非常簡單的程序。要啟用所有警告,請使用以下警告列表(可能有些警告是重復的,因為我沒有費心過濾啟用的警告-Wall)。


-Wabi -Wctor-dtor-privacy -Wnon-virtual-dtor -Wreorder -Weffc++ -Wstrict-null-sentinel -Wno-non-template-friend -Wold-style-cast -Woverloaded-virtual -Wno-pmf-conversions -Wsign-promo -Wextra -Wall -Waddress -Waggregate-return -Warray-bounds -Wno-attributes -Wno-builtin-macro-redefined -Wc++0x-compat -Wcast-align -Wcast-qual -Wchar-subscripts -Wclobbered -Wcomment -Wconversion -Wcoverage-mismatch -Wno-deprecated -Wno-deprecated-declarations -Wdisabled-optimization -Wno-div-by-zero -Wempty-body -Wenum-compare -Wno-endif-labels -Wfatal-errors -Wfloat-equal -Wformat -Wformat=2 -Wno-format-contains-nul -Wno-format-extra-args -Wformat-nonliteral -Wformat-security -Wformat-y2k -Wignored-qualifiers -Winit-self -Winline -Wno-int-to-pointer-cast -Wno-invalid-offsetof -Winvalid-pch -Wunsafe-loop-optimizations -Wlogical-op -Wlong-long -Wmain -Wmissing-braces -Wmissing-field-initializers -Wmissing-format-attribute -Wmissing-include-dirs -Wmissing-noreturn -Wno-mudflap -Wno-multichar -Wnonnull -Wno-overflow -Woverlength-strings -Wpacked -Wpacked-bitfield-compat -Wpadded -Wparentheses -Wpointer-arith -Wredundant-decls -Wreturn-type -Wsequence-point -Wshadow -Wsign-compare -Wsign-conversion -Wstack-protector -Wstrict-aliasing=1 -Wstrict-overflow=5 -Wswitch -Wswitch-default -Wswitch-enum -Wsync-nand -Wsystem-headers -Wtrigraphs -Wtype-limits -Wundef -Wuninitialized -Wunknown-pragmas -Wno-pragmas -Wunreachable-code -Wunused -Wunused-function -Wunused-label -Wunused-parameter -Wunused-value -Wunused-variable -Wvariadic-macros -Wvla -Wvolatile-register-var -Wwrite-strings


查看完整回答
反對 回復 2019-12-09
  • 3 回答
  • 0 關注
  • 1156 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號