Makefile選項CFLAGS,LDFLAGS,LIBS

我們用gcc編譯程序時,可能會用到“-I”(大寫i),“-L”(大寫l),“-l”(小寫l)等參數,例:

gcc -o hello hello.c -I /home/hello/include -L /home/hello/lib -lworld

上面這句表示在編譯hello.c時:

-I /home/hello/include表示將/home/hello/include目錄作爲第一個尋找頭文件的目錄,尋找的順序是:/home/hello/include-->/usr/include-->/usr/local/include

-L /home/hello/lib表示將/home/hello/lib目錄作爲第一個尋找庫文件的目錄,尋找的順序是:/home/hello/lib-->/lib-->/usr/lib-->/usr/local/lib

-lworld表示在上面的lib的路徑中尋找libworld.so動態庫文件(如果gcc編譯選項中加入了“-static”表示尋找libworld.a靜態庫文件)

Makefile選項CFLAGS,LDFLAGS,LIBS

CFLAGS 表示用於 C 編譯器的選項,CXXFLAGS 表示用於 C++ 編譯器的選項。這兩個變量實際上涵蓋了編譯和彙編兩個步驟。

  • CFLAGS: 指定頭文件(.h文件)的路徑,如:CFLAGS=-I /usr/include -I /path/include。同樣地,安裝一個包時會在安裝路徑下建立一個include目錄,當安裝過程中出現問題時,試着把以前安裝的包的include目錄加入到該變量中來。
  • LDFLAGS:gcc 等編譯器會用到的一些優化參數,也可以在裏面指定庫文件的位置。用法:LDFLAGS=-static -L /usr/lib -L /path/to/your/lib。每安裝一個包都幾乎一定的會在安裝目錄裏建立一個lib目錄。如果明明安裝了某個包,而安裝另一個包時,它愣是說找不到,可以抒那個包的lib路徑加入的LDFALGS中試一下。
  • LIBS:告訴鏈接器要鏈接哪些庫文件,如LIBS = -lpthread -liconv

簡單地說,LDFLAGS是告訴鏈接器從哪裏尋找庫文件,而LIBS是告訴鏈接器要鏈接哪些庫文件。不過使用時鏈接階段這兩個參數都會加上,所以你即使將這兩個的值互換,也沒有問題。

有時候LDFLAGS指定-L雖然能讓鏈接器找到庫進行鏈接,但是運行時鏈接器卻找不到這個庫,如果要讓軟件運行時庫文件的路徑也得到擴展,那麼我們需要增加這兩個庫給"-Wl,R":

LDFLAGS = -L/var/xxx/lib -L/opt/mysql/lib -Wl,R/var/xxx/lib -Wl,R/opt/mysql/lib

如果在執行./configure以前設置環境變量export LDFLAGS="-L/var/xxx/lib -L/opt/mysql/lib -Wl,R/var/xxx/lib -Wl,R/opt/mysql/lib" ,注意設置環境變量等號兩邊不可以有空格,而且要加上引號(shell的用法)。那麼執行configure以後,Makefile將會設置這個選項,鏈接時會有這個參數,編譯出來的可執行程序的庫文件搜索路徑就得到擴展了。

gcc總體選項列表:
在這裏插入圖片描述

gcc的告警和出錯選項如下所示:
在這裏插入圖片描述

如果gcc版本號爲7,那麼源代碼的switch-case塊中如果忘了加上break,有可能會報錯Implicit fallthrough error。我們只需要在CFLAGS後面加上-Wno-implicit-fallthrough,即可忽略gcc7編譯時switch-case中缺少break的錯誤。如下圖:
在這裏插入圖片描述

下面結合實例對告警和出錯選項進行簡單的介紹。這些特定警告選項中的每一個都有一個以“ -Wno- ”開始的否定形式來關閉警告; 例如, -Wno-implicit 。

-Wchar-subscripts
警告如果數組下標有char類型。 這是錯誤的常見原因,因爲程序員經常忘記這種類型是在某些機器上簽名的。 此警告由-Wall啓用。

-Wchkp
警告由指針界限檢查器( -fcheck-pointer-bounds )發現的無效內存訪問。

-Wno-coverage-mismatch
如果使用-fprofile-use選項時反饋配置文件不匹配,則警告 。 如果在使用-fprofile-gen編譯和使用-fprofile-use編譯時源文件發生更改,則具有配置文件反饋的文件可能無法與源文件匹配,並且GCC無法使用配置文件反饋信息。 默認情況下,此警告已啓用並被視爲錯誤。 -Wno-coverage-mismatch可用於禁用警告或-Wno-error = coverage-mismatch可用於禁用該錯誤。 禁用此警告的錯誤可能會導致代碼質量不佳,並且僅在非常小的更改情況下才有用,例如修復現有代碼庫的錯誤。 不建議完全禁用該警告。

-Wno-cpp
(僅限於Objective-C,C ++,Objective-C ++和Fortran)

禁止#warning指令發出的警告消息。

-Wdouble-promotion (C, C++, Objective-C and Objective-C++ only)
當float類型的值隱式提升爲double時發出警告。 具有32位“單精度”浮點單元的CPU實現float硬件,但在軟件中模擬double精度。 在這樣的機器上,由於軟件仿真所需的開銷,使用double值進行計算要昂貴得多。

使用double意外執行計算很容易,因爲浮點文字隱含了double類型。 例如,在:

float area(float radius)
{
return 3.14159 * radius * radius;
}

編譯器使用double執行整個計算,因爲浮點文字是double 。

-Wduplicate-decl-specifier (C and Objective-C only)
警告如果聲明有重複的const , volatile , restrict或_Atomic說明符。 此警告由-Wall啓用。

-Wformat
-Wformat= n
檢查對printf和scanf等的調用,以確保提供的參數的類型與指定的格式字符串相匹配,並且格式字符串中指定的轉換有意義。 這包括標準函數,以及其他由printf , scanf , strftime和strfmon (X / Open擴展,而不是C標準)系列(或其他特定於目標系列)的格式屬性(請參閱函數屬性 )指定的標準函數。 哪些函數在沒有指定格式屬性的情況下被檢查取決於所選擇的標準版本,並且沒有指定屬性的函數的這些檢查由-freestanding或-fno-builtin禁用。

格式將根據GNU libc版本2.2支持的格式特性進行檢查。 這些包括所有ISO C90和C99功能,以及Single Unix Specification和一些BSD和GNU擴展的功能。 其他庫實現可能不支持所有這些功能; GCC不支持關於超出特定圖書館限制的功能的警告。 但是,如果-Wpedantic與-Wformat 一起使用,則會提供有關格式特徵的警告,但不包括在選定的標準版本中(但不包含strfmon格式,因爲這些格式不在C標準的任何版本中)。 請參閱控制C語言的選項 。

-Wformat=1
-Wformat
選項-Wformat相當於-Wformat = 1 , -Wno-format相當於-Wformat = 0 。 由於-Wformat還檢查幾個函數的空格式參數, -Wformat也意味着-Wnonnull 。 這種格式檢查級別的某些方面可以通過以下選項禁用: -Wno-format-contains-nul , -Wno-format-extra-args和-Wno-format-zero-length 。 -Wformat由-Wall啓用。

-Wno-format-contains-nul
如果指定了-Wformat ,則不要警告有關包含NUL字節的格式字符串。

-Wno-format-extra-args
如果指定了-Wformat ,則不要警告有關printf或scanf格式函數的過多參數。 C標準指定了這樣的參數被忽略。

如果未使用的參數位於用’ $ ‘操作數編號規範指定的已使用參數之間,通常仍會給出警告,因爲實現無法知道傳遞給va_arg類型以跳過未使用的參數。 但是,在scanf格式的情況下,如果未使用的參數全部是指針,則此選項會抑制警告,因爲Single Unix Specification指出允許使用這些未使用的參數。

-Wformat-overflow
-Wformat-overflow= level
警告對可能溢出目標緩衝區的格式化輸入/輸出函數(如sprintf和vsprintf 。 當由格式指令寫入的確切字節數在編譯時無法確定時,它將根據啓發式進行估計,這取決於級別參數和優化。 雖然啓用優化在大多數情況下會提高警告的準確性,但也可能導致誤報。

-Wformat-overflow
-Wformat-overflow=1
-Wformat啓用的-Wformat-overflow的第1級採用了一種保守的方法,只警告最有可能溢出緩衝區的調用。 在此級別,格式化具有未知值的指令的數字參數假定值爲1,未知長度的字符串爲空。 已知綁定到其類型的子範圍的數字參數,或者其輸出受其指令的精度或有限的字符串文字限制的字符串參數被假定爲取值範圍內的值,該範圍導致輸出中的大部分字節。 例如,下面對sprintf的調用被診斷出來,因爲即使a和b都等於零,函數附加到目標緩衝區的終止NUL字符( ‘\0’ )也將被寫入其末尾。 將緩衝區的大小增加一個字節足以避免警告,儘管它可能不足以避免溢出。

void f(int a,int b)
{
char buf [13];
sprintf(buf,“a =%i,b =%i \ n”,a,b);
}

-Wformat-overflow=2
級別2還會警告有關可能溢出目標緩衝區的調用,因爲調用的參數長度或幅度足夠大。 在級別2處 ,未知數值參數被假定爲具有大於1的精度的帶符號類型的最小可表示值,否則爲最大可表示值。 未知的字符串參數的長度不能被假定爲由指令的精度,或者它們可能評估的字符串文字的有限集合,或者它們可能指向的字符數組所限定,都假定爲1個字符長。

在第2級,上述示例中的調用再次被診斷,但是這次因爲使用等於32位的INT_MIN ,第一個%i指令將在目標緩衝區的末尾寫入其一些數字。 爲了保證呼叫安全,無論兩個變量的值如何,目標緩衝區的大小必須增加到至少34個字節。 GCC在警告後的信息說明中包含緩衝區的最小大小。

增加目標緩衝區大小的替代方法是限制格式化值的範圍。 字符串參數的最大長度可以通過指定格式指令中的精度來限制。 當格式指令的數值參數可以假定爲小於它們類型的精度時,爲格式說明符選擇適當的長度修飾符將減少所需的緩衝區大小。 例如,如果上面示例中的a和b可以假定爲處於short int類型的精度範圍內,那麼使用%hi格式指令或將參數強制轉換爲short可將緩衝區的最大所需大小減少到24個字節。

void f(int a,int b)
{
char buf [23];
sprintf(buf,“a =%hi,b =%i \ n”,a,(簡寫)b);
}

-Wno-format-zero-length
如果指定了-Wformat ,則不要警告有關零長度格式。 C標準規定允許零長度格式。

-Wformat=2
啓用-Wformat加上其他格式檢查。 目前相當於-Wformat -Wformat-nonliteral -Wformat-security-Wformat-y2k 。

-Wformat-nonliteral
如果指定了-Wformat ,則還會警告格式字符串是否不是字符串文字,因此無法檢查,除非格式函數將其格式參數作爲va_list 。

-Wformat-security
如果指定了-Wformat ,還會警告使用表示可能的安全問題的格式化函數。 目前,這會警告printf和scanf函數的調用,其中格式字符串不是字符串文字,也沒有格式參數,如printf (foo); 。 如果格式字符串來自不可信輸入且包含’ %n ‘,則這可能是安全漏洞。 (這是目前W-format-nonliteral提出的警告的一個子集,但將來警告可能會被添加到-Wformat-security中 ,而不包括在-Wformat-nonliteral中 。)

-Wformat-signedness
如果指定了-Wformat ,則還會警告格式字符串是否需要一個無符號參數並且該參數是否有符號,反之亦然。

-Wformat-truncation
-Wformat-truncation= level
警告關於調用可能導致輸出截斷的格式化輸入/輸出函數(如snprintf和vsnprintf警告。 當由格式指令寫入的確切字節數在編譯時無法確定時,它將根據啓發式進行估計,這取決於級別參數和優化。 雖然啓用優化在大多數情況下會提高警告的準確性,但也可能導致誤報。 除非另有說明,該選項使用相同的邏輯 - 格式溢出 。

-Wformat-truncation
-Wformat-truncation=1
-Wformat啓用的-Wformat-truncation的 Level 1採用了一種保守的方法,只警告對有界函數的調用,該函數的返回值未使用,並且很可能導致輸出截斷。

-Wformat-truncation=2
級別2還警告對使用返回值的有界函數的調用,並且在給定足夠長度或幅度的參數時可能導致截斷。

-Wformat-y2k
如果指定了-Wformat ,還會警告有關可能只產生兩位數年份的strftime格式。

-Wnonnull
警告標記爲非空值函數屬性的參數需要傳遞空指針。

-Wnonnull包含在-Wall和-Wformat中 。 它可以通過-Wno-nonnull選項禁用。

-Wnonnull-compare
在比較標記nonnull空函數屬性的參數與函數內的空值時發出警告。

-Wnonnull-compare包含在-Wall中 。 它可以通過-Wno-nonnull-compare選項禁用。

-Wnull-dereference
如果編譯器檢測到由於取消引用空指針而導致觸發錯誤或未定義行爲的路徑,則發出警告。 該選項僅在-fdelete-null-pointer-checks處於活動狀態時纔有效,這是通過大多數目標中的優化啓用的。 警告的精度取決於所使用的優化選項。

-Winit-self (C, C++, Objective-C and Objective-C++ only)
警告使用自己初始化的未初始化變量。 請注意,此選項只能與-Wuninitialized選項一起使用。

例如,只有在指定-Winit-self時,GCC纔會在下面的代碼片段中提醒i未初始化:

int f()
{
int i = i;
回報我;
}

此警告由C ++中的-Wall啓用。

-Wimplicit-int (C and Objective-C only)
當聲明沒有指定類型時發出警告。 此警告由-Wall啓用。

-Wimplicit-function-declaration (C and Objective-C only)
在聲明之前使用函數時發出警告。 在C99模式下( -std = c99或-std = gnu99 ),默認情況下會啓用此警告,並通過-pedantic-errors將其設置爲錯誤 。 此警告也由-Wall啓用。

-Wimplicit (C and Objective-C only)
與-Wimplicit-int和-Wimplicit-function-declaration相同 。 此警告由-Wall啓用。

-Wimplicit-fallthrough
-Wimplicit- fallthrough與-Wimplicit- fallthrough = 3相同 , -Wno-implicit-fallthrough與-Wimplicit- fallthrough = 0相同 。

-Wimplicit-fallthrough= n
當開關盒跌落時發出警告。 例如:

switch (cond)
{
case 1:
a = 1;
break;
case 2:
a = 2;
case 3:
a = 3;
break;
}

當警告的最後一個語句不能通過時,例如當有一個返回語句或對noreturn屬性聲明的函數調用時,此警告不會警告。 -Wimplicit-fallthrough =也考慮到了控制流程語句,比如ifs,並且只在適當的時候發出警告。 例如

switch (cond)
{
case 1:
if (i > 3) {
bar (5);
break;
} else if (i < 1) {
bar (0);
} else
return;
default:

}

由於在某些情況下可能會出現切換情況,GCC提供了一個屬性__attribute__ ((fallthrough)) ,該屬性將與空語句一起使用來抑制通常會發生的警告:

switch (cond)
{
case 1:
bar (0);
attribute ((fallthrough));
default:

}

C ++ 17提供了一種標準的方法來抑制使用[[fallthrough]];的-Wimplicit-Fallthrough警告[[fallthrough]]; 而不是GNU屬性。 在C ++ 11或C ++ 14中,用戶可以使用[[gnu::fallthrough]]; ,這是一個GNU擴展。 除了這些屬性外,還可以添加一條跌落評論以使警告消失。 C或C ++樣式註釋的整個主體應該與下面列出的給定正則表達式匹配。 選項參數n指定接受哪種註釋:

-Wimplicit-Fallthrough = 0完全禁用警告。
-Wimplicit-fallthrough = 1匹配.正則表達式,任何評論都被用作fallthrough評論。
-wimplicit-fallthrough = 2 case nonnsitively matches .falls?[ \t-]thr(ough|u).正則表達式。
-Wimplicit-fallthrough = 3大小寫敏感地匹配以下正則表達式之一:
-fallthrough
@fallthrough@
lint -fallthrough[ \t]

[ \t.!]
(ELSE,? |INTENTIONAL(LY)? )?
FALL(S | |-)?THR(OUGH|U) \t.!?
[ \t.!](Else,? |Intentional(ly)? )?
Fall((s | |-)[Tt]|t)hr(ough|u) \t.!?
[ \t.!]
([Ee]lse,? |[Ii]ntentional(ly)? )?
fall(s | |-)?thr(ough|u) \t.!?
-Wimplicit-fallthrough = 4大小寫敏感地匹配以下正則表達式之一:
-fallthrough
@fallthrough@
lint -fallthrough[ \t]*
[ \t]FALLTHR(OUGH|U)[ \t]
-Wimplicit-Fallthrough = 5不會將任何註釋識別爲傳遞註釋,只有屬性禁用警告。
註釋需要在可選空白和其他註釋之後遵循case或default關鍵字或者某個case或default標籤之前的用戶標籤。

switch (cond)
{
case 1:
bar (0);
/* FALLTHRU */
default:

}

-Wimplicit-Fallthrough = 3警告由-Wextra啓用。

-Wif-not-aligned (C, C++, Objective-C and Objective-C++ only)
控制是否應發出由warn_if_not_aligned屬性觸發的警告。 這是默認啓用的。 使用-Wno-if-not-aligned來禁用它。

-Wignored-qualifiers (C and C++ only)
如果函數的返回類型具有類型限定符(如const ,則發出警告。 對於ISO C這樣的類型限定符沒有效果,因爲函數返回的值不是左值。 對於C ++來說,警告只是針對標量類型或void發出的。 ISO C禁止在函數定義上使用合格的void返回類型,所以這種返回類型總是會在沒有這個選項的情況下收到警告。

此警告也由-Wextra啓用。

-Wignored-attributes (C and C++ only)
當屬性被忽略時發出警告。 這與-Wattributes選項不同,它會在編譯器決定刪除屬性時發出警告,而不是該屬性未知,在錯誤的地方使用等。此警告默認情況下處於啓用狀態。

-Wmain
如果main類型可疑,則發出警告。 main應該是一個具有外部鏈接的函數,返回int,可以使用零參數,兩個或三個適當類型的參數。 此警告在C ++中是默認啓用的,可以通過-Wall或-Wpedantic來啓用。

-Wmisleading-indentation (C and C++ only)
當代碼的縮進不反映塊結構時發出警告。 具體而言,針對if , else , while和for子句發出警告,其中警告語句不使用大括號,後跟具有相同縮進的未保護語句。

在下面的例子中,對“bar”的調用被誤導地縮進,就好像它受到“if”條件的保護。

if(some_condition())
foo();
bar(); /* Gotcha: this is not guarded by the “if”. */

在混合製表符和空格的情況下,警告使用-ftabstop =選項來確定語句是否排隊(默認爲8)。

對於涉及多行預處理器邏輯的代碼(如以下示例),不會發出該警告。

if (flagA)
foo (0);
#if SOME_CONDITION_THAT_DOES_NOT_HOLD
if (flagB)
#endif
foo (1);

該警告不會在#line指令之後發出,因爲這通常會指示自動生成的代碼,並且不會假定該指令所引用的文件的佈局。

此警告是由C和C ++中的-Wall啓用的。

-Wmissing-attributes
當函數聲明缺少一個或多個屬性時,警告聲明相關函數,並且其缺少可能會對生成的代碼的正確性或效率產生負面影響。 例如,在C ++中,當使用屬性alloc_align , assume_aligned , assume_aligned , format , format_arg , malloc或assume_aligned聲明的主模板的顯式特化未聲明時,會發出警告。 deprecated屬性, error和warning抑制警告。 (請參閱功能屬性 )。

-Wmissing-attributes由-Wall啓用。

例如,由於下面的主要函數模板的聲明使用屬性malloc和alloc_size ,因此模板的顯式特化的聲明被診斷,因爲它缺少其中一個屬性。

template
T* attribute ((malloc, alloc_size (1)))
allocate (size_t);

template <>
void* attribute ((malloc)) // missing alloc_size
allocate (size_t);

-Wmissing-braces
如果聚合或聯合初始值設定項沒有完全包圍,則發出警告。 在以下示例中,a的初始值設定項未完全包圍,但b的完全包圍。 此警告由C中的-Wall啓用

int a [2] [2] = {0,1,2,3};
int b [2] [2] = {{0,1},{2,3}};

此警告由-Wall啓用。

-Wmissing-include-dirs (C, C++, Objective-C and Objective-C++ only)
如果用戶提供的包含目錄不存在,則發出警告。

-Wmultistatement-macros
警告不安全的多語句宏,這些宏看起來像if , else , for , switch或while這樣的子句可以保護,其中只有第一條語句在擴展宏後才實際被保護。

例如:

#define DOIT x++; y++
if ©
DOIT;

將無條件地增加y ,而不僅僅是當c成立時。 通常可以通過將宏包裝在do-while循環中來解決該問題:

#define DOIT do { x++; y++; } while (0)
if ©
DOIT;

此警告是由C和C ++中的-Wall啓用的。

-Wparentheses
如果在某些上下文中省略了括號,例如當預期有真值的上下文中存在賦值時,或者運算符嵌套,其優先級人員經常會感到困惑時,會發出警告。

還會發出如x<=y<=z等比較結果的警告。 這相當於(x<=y ? 1 : 0) <= z ,這是與普通數學符號的解釋不同的解釋。

還警告GNU擴展的危險用途?:省略中間操作數。 當條件在? :運算符是一個布爾表達式,省略的值始終爲1.程序員通常希望它是在條件表達式內計算的值。

對於C ++,這也會在聲明中警告一些不必要的括號,這可能表示試圖在函數調用而不是聲明:

{
// Declares a local variable called mymutex.
std::unique_lockstd::mutex (mymutex);
// User meant std::unique_lockstd::mutex lock (mymutex);
}

此警告由-Wall啓用。

-Wsequence-point
由於違反了C和C ++標準中的順序點規則,因此可能會有未定義語義的代碼發出警告。

C和C ++標準定義了C / C ++程序中的表達式按順序點進行評估的順序 , 順序點表示執行程序各部分之間的部分順序:在順序點之前執行的順序點和在執行之後執行的順序點它。 這些發生在對一個&& , ||的第一個操作數進行評估之後,對一個完整表達式(不是更大表達式的一部分)進行評估之後。 , ? : ? :或(逗號)運算符,然後調用一個函數(但在其參數和表達被調用函數的表達式之後)以及某些其他地方。 除了順序點規則所表達的內容之外,沒有指定表達式的子表達式的評估順序。 所有這些規則只描述部分順序而不是全部順序,例如,如果在一個表達式中調用了兩個函數,而它們之間沒有順序點,則函數被調用的順序未被指定。 但是,標準委員會已經裁定函數調用不重疊。

在序列點之間不會指定對對象值的修改生效。 行爲依賴於此的程序具有未定義的行爲; C和C ++標準規定:“在前一個和下一個序列點之間,一個對象最多應該通過評估一個表達式修改其存儲值。 此外,先前值只能讀取,以確定要存儲的值。“ 如果一個程序違反了這些規則,任何特定實現的結果都是完全不可預測的。

具有未定義行爲的代碼示例是a = a++; , a[n] = b[n++]和a[i++] = i; 。 一些更復雜的病例不會被這個選項診斷出來,它可能會偶爾出現假陽性結果,但總的來說,在檢測程序中的這類問題時發現它相當有效。

C ++ 17標準將在更多情況下定義操作數的評估順序:特別是它要求在左側之前評估賦值的右側,所以上面的例子不再是未定義的。 但是這個警告仍然會警告他們,幫助人們避免編寫C語言和早期C ++版本中未定義的代碼。

這個標準的措辭令人困惑,因此在微妙的情況下,對序列點規則的確切含義存在一些爭議。 有關問題討論的鏈接,包括提出的正式定義,可以在GCC的閱讀頁面上找到, 網址爲http://gcc.gnu.org/readings.html 。

對於C和C ++,此警告由-Wall啓用。

-Wno-return-local-addr
不要警告在函數返回後將指針(或C ++,引用)返回到超出範圍的變量。

-Wreturn-type
每當使用默認爲int的返回類型定義函數時發出警告。 還會在返回類型不爲void的函數中返回沒有返回值的return語句(從函數體的末尾落下被認爲沒有值返回)。

僅對於C,在函數的返回類型爲void ,使用表達式的return語句發出警告,除非表達式類型也爲void 。 作爲GNU擴展,除非使用-Wantantic,否則後一種情況會被接受而不會有警告。

對於C ++,即使指定了-Wno-return-type ,沒有返回類型的函數也會生成診斷消息。 唯一的例外是在系統頭文件中定義的main和函數。

此警告由-Wall啓用。

-Wshift-count-negative
如果移位計數爲負,則發出警告。 該警告默認啓用。

-Wshift-count-overflow
如果移位計數> =類型的寬度,則發出警告。 該警告默認啓用。

-Wshift-negative-value
警告如果左移一個負值。 -Wextra在C99和C ++ 11模式(和更新版本)中啓用此警告。

-Wshift-overflow
-Wshift-overflow= n
警告左移溢出。 此警告在C99和C ++ 11模式(及更新版本)中默認啓用。

-Wshift-overflow=1
這是-Wshift-overflow的警告級別,並且在C99和C ++ 11模式(和更新版本)中默認啓用。 此警告級別不警告將左移1到符號位。 (但是,在C語言中,在需要整型常量表達式的上下文中仍會拒絕這樣的溢出。)

-Wshift-overflow=2
除非C ++ 14模式處於活動狀態,否則此警告級別還會警告左移符號位1。

-Wswitch
如果switch語句具有枚舉類型的索引並且缺少該枚舉的一個或多個指定代碼的case ,則發出警告。(default標籤的存在會阻止此警告。)case使用此選項時(即使有default標籤),枚舉範圍外的標籤也會引發警告。此警告由啓用-Wall 。

-Wswitch-default
每當switch陳述沒有default案件時警告。

-Wswitch-enum
每當switch語句具有枚舉類型的索引並且缺少該枚舉case的一個或多個指定代碼時發出警告。case枚舉範圍外的標籤在使用此選項時也會引發警告。唯一的區別-Wswitch此選項是即使存在default標籤,此選項也會提供有關省略的枚舉代碼的警告。

-Wswitch-bool
只要switch語句具有布爾類型的索引並且大小寫值超出布爾類型的範圍,就會發出警告。可以通過將控制表達式轉換爲除以外的類型來抑制此警告bool。例如:

switch ((int) (a == 4))
{

}

C和C ++程序默認啓用此警告。

-Wswitch-unreachable
只要switch語句包含控制表達式和第一個case標籤之間的語句,即永遠不會執行的語句,就會發出警告。例如:

switch (cond)
{
i = 15;

case 5:

}

-Wswitch不可達 如果控件表達式和第一個case標籤之間的聲明只是一個聲明,則不會發出警告:

switch (cond)
{
int i;

case 5:
i = 5;

}

C和C ++程序默認啓用此警告。

-Wsync-nand (C and C++ only)
當警告__sync_fetch_and_nand和__sync_nand_and_fetch使用的內置功能。這些函數改變了GCC 4.4中的語義。

-Wunused-but-set-parameter
每當一個函數參數被賦值時發出警告,但是除此之外不用(除了聲明)。

要抑制此警告,請使用該unused屬性(請參閱變量屬性)。

此警告也由啓用 -Wunused 和…一起 -Wextra 。

-Wunused-but-set-variable
每當一個局部變量被分配時發出警告,但在其他情況下不用(除了聲明)。此警告由啓用-Wall 。

要抑制此警告,請使用該unused屬性(請參閱變量屬性)。

此警告也由啓用 -Wunused ,這是啓用的 -Wall 。

-Wunused-function
每當聲明靜態函數但未定義或未使用非內聯靜態函數時發出警告。此警告由啓用-Wall 。

-Wunused-label
只要標籤被聲明但未被使用,就會發出警告。此警告由啓用-Wall 。

要抑制此警告,請使用該unused屬性(請參閱變量屬性)。

-Wunused-local-typedefs (C, Objective-C, C++ and Objective-C++ only)
當沒有使用在函數中本地定義的typedef時發出警告。此警告由啓用-Wall 。

-Wunused-parameter
除了聲明之外,只要函數參數沒有被使用,就會發出警告。

要抑制此警告,請使用該unused屬性(請參閱變量屬性)。

-Wno-unused-result
不要警告標記了屬性的函數的調用者是否使用它的返回值warn_unused_result(請參閱函數屬性)。默認是-Wunused-結果 。

-Wunused-variable
只要本地或靜態變量不在聲明中使用,就會發出警告。這個選項意味着-Wunused const的變量= 1爲C,但不適用於C ++。此警告由啓用-Wall 。

要抑制此警告,請使用該unused屬性(請參閱變量屬性)。

-Wunused-const-variable
-Wunused-const-variable= n
警告只要一個常量靜態變量不用於聲明就可以使用。 -Wunused const的變量= 1 由…啓用 -Wunused可變爲C,但不適用於C ++。在C中聲明瞭變量存儲,但在C ++中,這不是一個錯誤,因爲const變量取代了#defines。

要抑制此警告,請使用該unused屬性(請參閱變量屬性)。

-Wunused-const-variable=1
這是由啓用的警告級別 -Wunused可變 它只針對主編譯單元中定義的未使用的靜態常量變量發出警告,但不包括有關任何頭中聲明的靜態常量變量。

-Wunused-const-variable=2
此警告級別還警告標題中的未使用的常量靜態變量(不包括系統標題)。這是警告級別-Wunused const的可變 並且必須明確要求,因爲在C ++中這不是錯誤,而在C中可能很難清理包含的所有頭文件。

-Wunused-value
當語句計算明確未使用的結果時發出警告。要抑制此警告,請將未使用的表達式轉換爲void。這包括表達式語句或不包含副作用的逗號表達式的左側。例如,表達式x[i,j]會導致警告,但x[(void)i,j]不會。

此警告由啓用 -Wall 。

-Wunused
All the above -Wunused options combined.

In order to get a warning about an unused function parameter, you must either specify -Wextra -Wunused (note that -Wall implies -Wunused ), or separately specify -Wunused-parameter .

-Wuninitialized
Warn if an automatic variable is used without first being initialized or if a variable may be clobbered by a setjmp call. In C++, warn if a non-static reference or non-static const member appears in a class without constructors.

If you want to warn about code that uses the uninitialized value of the variable in its own initializer, use the -Winit-self option.

These warnings occur for individual uninitialized or clobbered elements of structure, union or array variables as well as for variables that are uninitialized or clobbered as a whole. They do not occur for variables or elements declared volatile . Because these warnings depend on optimization, the exact variables or elements for which there are warnings depends on the precise optimization options and version of GCC used.

Note that there may be no warning about a variable that is used only to compute a value that itself is never used, because such computations may be deleted by data flow analysis before the warnings are printed.

-Winvalid-memory-model
Warn for invocations of __atomic Builtins , __sync Builtins , and the C11 atomic generic functions with a memory consistency argument that is either invalid for the operation or outside the range of values of the memory_order enumeration. For example, since the __atomic_store and __atomic_store_n built-ins are only defined for the relaxed, release, and sequentially consistent memory orders the following code is diagnosed:

void store (int *i)
{
__atomic_store_n (i, 0, memory_order_consume);
}

-Winvalid-memory-model is enabled by default.

-Wmaybe-uninitialized
對於自動(即局部)變量,如果存在從函數入口到被初始化的變量的使用的路徑,但是存在其他變量未初始化的其他路徑,則編譯器在不能初始化的情況下發出警告證明在運行時未執行未初始化的路徑。

這些警告只能在優化編譯時使用,否則GCC不會跟蹤變量的狀態。

這些警告是可選的,因爲即使出現錯誤,GCC也可能無法確定代碼何時正確。以下是可能發生的一個例子:

{
int x;
switch (y)
{
case 1: x = 1;
break;
case 2: x = 4;
break;
case 3: x = 5;
}
foo (x);
}

如果值y始終爲1,2或3,則x始終進行初始化,但GCC不知道這一點。要取消警告,您需要提供一個默認情況下的斷言(0)或類似的代碼。

此選項還會在非易失性自動變量被呼叫更改時發出警告longjmp。編譯器只能看到呼叫setjmp。它不知道哪裏longjmp會叫; 實際上,信號處理程序可以在代碼中的任何位置調用它。因此,即使實際上沒有問題,您也可能會收到警告,因爲longjmp實際上不會在會導致問題的地方調用。

如果您聲明所有永遠不會返回的函數,則可以避免一些虛假警告noreturn。請參閱功能屬性。

此警告由啓用 -Wall 要麼 -Wextra 。

-Wunknown-pragmas

pragma遇到GCC無法理解的指令時發出警告。如果使用此命令行選項,則甚至會爲系統頭文件中的未知編譯指示發出警告。如果只有警告才被啓用,情況並非如此-Wall 命令行選項。
-Wno-pragmas
不要警告有關編譯指示的誤用,例如參數不正確,語法無效或編譯指示衝突。也可以看看-Wunknown的編譯指示 。

-Wstrict-aliasing
該選項僅在激活時纔有效 -fstrict走樣活躍。它警告可能會破壞編譯器用於優化的嚴格別名規則的代碼。警告並沒有涵蓋所有情況,但確實試圖抓住更常見的陷阱。它包含在中-Wall。這相當於-Wstrict-aliasing=3.

Wsuggest-attribute= [ pure | const | noreturn | format | cold | malloc ]
警告添加屬性可能會有好處的情況。下面列出了當前支持的屬性。

-Wsuggest-attribute=pure
-Wsuggest-attribute=const
-Wsuggest-attribute=noreturn
-Wsuggest-attribute=malloc
發出警告的功能,可能是屬性候選人pure,const或noreturn或malloc。編譯器只警告在其他編譯單元或(在的情況下,可見功能pure和const),如果它不能證明該功能正常返回。如果函數不包含無限循環或通過拋出,調用abort或陷印異常返回,函數將正常返回。該分析需要選項-fipa純const的 ,這在默認情況下是啓用的 -O和更高。更高的優化級別可以提高分析的準確性。

-Wsuggest-attribute=format
-Wmissing-format-attribute
警告可能是format屬性候選的函數指針。請注意,這些只是可能的候選人,而不是絕對的。 GCC猜測具有format賦值,初始化,參數傳遞或返回語句中使用的屬性的函數指針format在結果類型中應該具有相應的屬性。即分配或初始化的左側,參數變量的類型或包含函數的返回類型應分別具有一個format屬性以避免警告。

海灣合作委員會也警告可能是format屬性候選的函數定義。再次,這些只是可能的候選人。GCC猜測format屬性可能適用於任何調用類似vprintfor 的函數vscanf,但這可能不總是這種情況,並且format可能不會檢測到屬性適當的某些函數。

-Wsuggest-attribute=cold
警告可能是cold屬性候選項的函數。這是基於靜態檢測的,一般只會警告那些總是會導致調用另一個cold函數的函數,比如C ++的包裝器throw或致命的錯誤報告函數abort。

-Wsuggest-final-types
如果類型是用C ++ 11 final說明符聲明的,或者如果可能的話,聲明在匿名名稱空間中,則可通過虛擬方法警告代碼質量將得到改進的類型。這允許GCC更積極地虛擬化多態呼叫。鏈接時間優化時,此警告更有效,其中關於類層次結構圖的信息更加完整。

-Wsuggest-final-methods
如果方法是用C ++ 11 final說明符聲明的,或者如果可能的話,它的類型是在匿名名稱空間或說明final符中聲明的,則會警告虛擬方法的代碼質量會提高。對於鏈接時優化,此警告更有效,其中關於類層次結構圖的信息更加完整。建議首先考慮建議-Wsuggest決賽類型 然後用新的註釋重建。

-Wsuggest-override
警告重寫未使用override關鍵字標記的虛擬函數。

-Walloc-zero
警告調用飾屬性分配函數alloc_size指定零個字節,包括那些功能內置形式aligned_alloc,alloca,calloc,malloc,和realloc。由於這些函數在零大小調用時的行爲在不同實現中(並且在realloc已被棄用的情況下)有所不同,因此依賴它可能會導致巧妙的可移植性錯誤,因此應該避免。

-Walloc-size-larger-than= n
警告關於對使用屬性裝飾的函數的調用,alloc_size該屬性嘗試分配大於指定字節數的對象,或者以無限精度的整數類型的大小計算結果超過該值SIZE_MAX / 2。在選項參數Ñ可以在標準後綴指定字節的倍數中的一個端部如kB和KiB爲千字節和kibibyte分別MB和MiB爲兆字節和mebibyte,等等。請參閱功能屬性。

-Walloca
此選項會警告alloca源中的所有用途。

-Walloca-larger-than= n
此選項會對調用發出警告,該調用alloca不受限制其整數類型參數爲最多n個字節的控制謂詞限制,或者調用alloca限制未知的位置。非整數類型的參數被認爲是無界限的,即使它們似乎受限於預期的範圍。

例如,一個有界的情況alloca可能是:

void func (size_t n)
{
void *p;
if (n <= 1000)
p = alloca (n);
else
p = malloc (n);
f §;
}

在上面的示例中,傳遞-Walloca-larger-than=1000不會發出警告,因爲調用alloca已知最多爲1000個字節。但是,如果-Walloca-larger-than=500通過,編譯器會發出警告。

另一方面,無界用途是alloca沒有控制謂詞約束其整數參數的用法。例如:

void func()
{
void * p = alloca(n);
f(p);
}

如果-Walloca-larger-than=500通過,上述情況會觸發警告,但這次是因爲缺少邊界檢查。

請注意,即使看起來正確的代碼涉及有符號整數可能會導致警告:

void func (signed int n)
{
if (n < 500)
{
p = alloca (n);
f §;
}
}

在上面的例子中,n可能是負數,導致比期望的參數更隱含地投入到alloca調用中。

此選項還會alloca在循環中使用時發出警告。

此警告未啓用 -Wall ,並且只在有效時纔有效 -ftree-VRP 是活動的(默認爲 -02 以上)。

也可以看看 -Wvla-greater-than = n 。

-Warray-bounds
-Warray-bounds= n
該選項僅在激活時纔有效 -ftree-VRP 是活動的(默認爲 -02以上)。它警告下標總是超出範圍的數組。此警告由啓用-Wall 。

-Warray-bounds=1
這是警告級別 -Warray界 並被啓用 -Wall; 更高層次不是,並且必須明確要求。

-Warray-bounds=2
此警告級別還會警告結構體末端的數組以及通過指針訪問的數組的出界限。此警告級別可能會導致大量的誤報,並且默認情況下會停用。

-Wattribute-alias
警告使用alias目標與別名類型不兼容的類似屬性的聲明。請參閱聲明函數的屬性。

-Wbool-compare
與不同於true/ 的整數值相比,關於布爾表達式的警告false。例如,以下比較始終是錯誤的:

int n = 5;

if ((n > 1) == 2) { … }

此警告由啓用 -Wall 。

-Wbool-operation
警告布爾類型表達式的可疑操作。例如,按位取反布爾值很可能是程序中的一個錯誤。對於C來說,這個警告還會警告增加或減少布爾值,這很少有意義。(在C ++中,遞減布爾值總是無效的。在C ++ 17中遞增布爾值是無效的,否則不推薦使用。)

此警告由啓用 -Wall 。

-Wduplicated-branches
當if-else具有相同的分支時發出警告。此警告檢測類似的情況

if (p != NULL)
return 0;
else
return 0;

當兩個分支只包含一個空語句時它不會發出警告。此警告還警告有條件的操作員:

int i = x?* p:* p;
-Wduplicated-cond
在if-else-if鏈中警告重複的條件。例如,警告以下代碼:

if (p->q != NULL) { … }
else if (p->q != NULL) { … }

-Wframe-address
警告當’ __builtin_frame_address ’ 要麼 ’ __builtin_return_address’被調用的參數大於0.這種調用可能會返回不確定的值或崩潰程序。警告包含在-Wall 。

-Wno-discarded-qualifiers (C and Objective-C only)
不要警告指針上的類型限定符是否被丟棄。通常,編譯器會警告const char 變量是否傳遞給了一個帶char 參數的函數。這個選項可以用來抑制這樣的警告。

-Wno-discarded-array-qualifiers (C and Objective-C only)
不要警告在指針目標數組上的類型限定符是否被丟棄。通常,編譯器會警告const int ()[]變量是否傳遞給了一個帶int ()[]參數的函數。這個選項可以用來抑制這樣的警告。

-Wno-incompatible-pointer-types (C and Objective-C only)
當不兼容類型的指針之間發生轉換時,不要發出警告。此警告適用於未涵蓋的情況-Wno指針-SIGN ,它警告指針參數傳遞或具有不同簽名的分配。

-Wno-int-conversion (C and Objective-C only)
不要警告不兼容的整數指針和指向整數轉換的指針。此警告是關於隱式轉換的; 用於顯式轉換警告-Wno-INT到指針鑄造 和 -Wno指針到INT-投 可能用過了。

-Wno-div-by-zero
不要警告編譯時的整數除零。零點浮點除法沒有被警告,因爲它可以是獲得無窮大和NaN的合法方式。

-Wsystem-headers
打印系統頭文件中的結構的警告消息。系統頭文件中的警告通常會被抑制,假設它們通常不表示真正的問題,並且只會使編譯器輸出更難以閱讀。使用這個命令行選項可以告訴GCC從系統標題中發出警告,就好像它們出現在用戶代碼中一樣。但是,請注意使用-Wall與此選項一起並沒有警告的系統頭,對於未知編譯指示,-Wunknown的編譯指示 也必須使用。

-Wtautological-compare
警告如果自我比較總是評估爲真或假。此警告檢測各種錯誤,如:

int i = 1;

if (i > i) { … }

此警告還會警告總是評估爲真或假的比特比較,例如:

if ((a & 16) == 10) { … }
1
將永遠是錯誤的。

此警告由啓用 -Wall 。

-Wtrampolines
警告爲指向嵌套函數生成的蹦牀。蹦牀是在運行時在堆棧上創建的一小段數據或代碼,當嵌套函數的地址被採用時,用於間接調用嵌套函數。對於某些目標,它僅由數據組成,因此不需要特殊處理。但是,對於大多數目標來說,它是由代碼組成的,因此需要使堆棧可執行才能使程序正常工作。

-Wfloat-equal
如果在相等比較中使用浮點值,則發出警告。

這背後的想法是,有時候對於程序員來說,將浮點值視爲對無限精確實數的逼近是很方便的。如果你這樣做,那麼你需要計算(通過分析代碼,或者以其他方式)計算引入的最大或可能的最大誤差,並且在執行比較時允許它(並且當產生輸出時,但是這是一個不同的問題)。特別是,您應該檢查兩個值是否具有重疊範圍,而不是測試相等性。這是通過關係運算符完成的,所以平等比較可能是錯誤的。

-Wtraditional (C and Objective-C only)
警告某些在傳統和ISO C中表現不同的結構。還警告有關沒有傳統C等價物的ISO C結構和/或應避免的有問題的結構。

在宏體中出現在字符串文字中的宏參數。在傳統的C宏替換髮生在字符串文字中,但在ISO C中不。
在傳統的C中,一些預處理器指令不存在。傳統的預處理器只有在’#’出現在第1行上。因此-Wtraditional 警告傳統C理解但忽略的指令,因爲’ #’不會顯示爲該行的第一個字符。它也建議你#pragma通過縮進來隱藏傳統C無法理解的指令。一些傳統的實現不承認#elif,所以這個選項建議完全避免它。
類似於函數的宏,不帶參數出現。
一元加運算符。
” ü ‘整數常量後綴,或’ F ’ 要麼 ’ 大號’浮點常量後綴。(傳統的C確實支持’大號 ‘後綴在整型常量上。)注意,這些後綴出現在大多數現代系統的系統頭文件中定義的宏中,例如’ _Min ‘/’ _MAX’宏’

for(SomeIterator i = SomeObj.begin(); i!= SomeObj.end(); ++ i)
{
for(int i = 0; i <N; ++ i)
{

}

}

由於上述i示例中的兩個變量具有不兼容的類型,因此僅啓用-Wshadow =兼容本地不會發出警告。因爲它們的類型是不兼容的,所以如果程序員意外地使用一個來代替另一個,那麼類型檢查會捕獲它併發出錯誤或警告。所以在這種情況下不要警告(關於影子)不會導致未被發現的錯誤。使用這個標誌而不是-Wshadow =本地 可能會減少故意投影引發的警告數量。

此警告由啓用 -Wshadow =本地 。

-Wlarger-than= len
每當定義大於len字節的對象時發出警告。

-Wframe-larger-than= len
如果函數幀的大小大於len字節,則發出警告。完成確定堆棧幀大小的計算是近似的而不是保守的。即使您沒有收到警告,實際需求可能會比len略高。另外,alloca在確定是否發出警告時,編譯器不包括通過可變長度數組或相關結構分配的任何空間。

-Wno-free-nonheap-object
嘗試釋放未在堆中分配的對象時,不要警告。

-Wstack-usage= len
警告函數的堆棧使用情況可能大於len字節。確定堆棧使用情況的計算是保守的。alloca在確定是否發出警告時,由編譯器包含通過,可變長度數組或相關結構分配的任何空間。

這個消息符合輸出 -fstack使用率 。

如果堆棧使用情況完全是靜態的,但超過了指定的數量,則是:
警告:堆棧使用量爲1120字節( warning: stack usage is 1120 bytes)
如果堆棧使用情況(部分)是動態的但有界限的,則是:
警告:堆棧使用可能是1648字節(warning: stack usage might be 1648 bytes)
如果堆棧使用情況(部分)是動態的並且不受限制,那麼:
警告:堆棧使用可能是無限的( warning: stack usage might be unbounded)
-Wunsafe-loop-optimizations
警告如果循環無法優化,因爲編譯器無法假設循環索引的範圍內的任何內容。同-funsafe循環的優化 警告如果編譯器做出這樣的假設。

-Wno-pedantic-ms-format (MinGW targets only)
與…結合使用時 -Wformat 和 -pedantic無GNU擴展,此選項禁用約非ISO的警告printf/ scanf格式寬度說明I32,I64以及I在Windows目標,其中依賴於MS運行時使用。

-Waligned-new
警告需要更大對齊類型的新表達式,alignof(std::max_align_t)但使用不帶明確對齊參數的分配函數。該選項由啓用-Wall 。

通常這隻會警告全局分配函數,但是 -Waligned全新=所有 也警告類成員分配功能。

-Wplacement-new
-Wplacement-new= n
警告使用未定義行爲放置新表達式,例如在小於對象類型的緩衝區中構造對象。例如,下面的放置新表達式被診斷,因爲它試圖在只有64個字節大的緩衝區中構造64個整數的數組。

char buf [64];
new(buf)int [64];

該警告默認啓用。

-Wplacement-new=1
這是默認的警告級別 -Wplacement新。在這個級別上,對於一些嚴格未定義的結構,GCC允許將其作爲與舊代碼兼容的擴展來發布警告。例如,new即使根據C ++標準具有未定義的行爲,也會在該級別診斷下列表達式,因爲它會寫入超過一個元素數組的末尾。

struct S {int n,a [1]; };
S * s =(S *)malloc(sizeof * s + 31 * sizeof s-> a [0]);
new(s-> a)int [32]();

-Wplacement-new=2
在這個級別上,除了診斷與級別1相同的所有構造外,還會發佈一個診斷信息,用於放置新構造一個對象的最終構造,該構造的最後一個構件的類型是單個元素的數組,並且其大小較小比正在構建的對象的大小。雖然前面的示例將被診斷,但以下構造使用靈活的成員數組擴展來避免第2級的警告。

struct S {int n,a []; };
S * s =(S *)malloc(sizeof * s + 32 * sizeof s-> a [0]);
new(s-> a)int [32]();

-Wpointer-arith
警告任何取決於“功能類型”或“功能類型”的大小void。GNU C將這些類型的大小指定爲1,以方便計算void *指針和指向函數的指針。在C ++中,當算術運算涉及時也會發出警告NULL。此警告也由啓用-Wpedantic 。

-Wpointer-compare
如果指針與零字符常量進行比較,則發出警告。這通常意味着指針被解除引用。例如:

const char *p = foo ();
if (p == ‘\0’)
return 42;

請注意,上面的代碼在C ++ 11中無效。

該警告默認啓用。

-Wtype-limits
如果由於數據類型範圍有限而導致比較始終爲真或始終爲false,但不警告常量表達式。例如,警告如果將一個無符號變量與<或與0進行比較>=。此警告也由啓用-Wextra 。

-Wcomment
-Wcomments
每當評論開始序列’ / * ‘出現在’ / * ‘評論,或者每當一個反斜線換行符出現在’ //’評論。此警告由啓用-Wall 。

-Wtrigraphs
如果遇到可能會改變程序含義的三字母警告,則發出警告。評論中的三字代碼不會被警告,除了那些會形成轉義換行符的代碼。

這個選項是隱含的 -Wall。如果-Wall沒有給出,除非啓用三字母,否則該選項仍然有效。要獲得沒有警告的三字母轉換,但要獲得另一個-Wall 警告,使用’ -trigraphs -Wall -Wno-trigraphs ”。

-Wundef
警告如果在#if指令中評估未定義的標識符。這些標識符被替換爲零。

-Wexpansion-to-defined
每當’ 定義 ‘在擴展宏時遇到(包括宏被擴展爲’ #如果’指令)。這種用法是不便攜的。此警告也由啓用-Wpedantic 和 -Wextra 。

-Wunused-macros
警告主文件中定義的未使用的宏。如果擴展或測試存在至少一次,則使用宏。預處理器還會警告,如果宏在重新定義或未定義時尚未使用。

內建的宏,命令行中定義的宏和包含文件中定義的宏不會被警告。

注意:如果實際使用宏,但僅用於跳過的條件塊,則預處理器將其報告爲未使用。爲了避免在這種情況下發出警告,可以通過例如將其移動到第一個跳過的塊中來改善宏定義的範圍。或者,您可以提供一個類似以下內容的虛擬用途:

#if defined the_macro_causing_the_warning
#endif

-Wno-endif-labels
不論何時#else或#endif之後都有文字,不要警告。這有時會發生在具有表單代碼的較早程序中

#if FOO

#else FOO

#endif FOO

第二和第三位FOO應該在評論中。此警告默認開啓。

-Wbad-function-cast (C and Objective-C only)
當函數調用轉換爲不匹配類型時發出警告。例如,警告如果對返回整數類型的函數的調用轉換爲指針類型。

-Wc90-c99-compat (C and Objective-C only)
警告ISO C90中不存在的功能,但存在於ISO C99中。例如,警告使用可變長度數組,long long類型,bool類型,複合文字,指定初始值設定項等等。該選項獨立於標準模式。在下面的表達式中警告被禁用__extension__。

-Wc99-c11-compat (C and Objective-C only)
警告ISO C99中不存在的功能,但存在於ISO C11中。例如,警告使用匿名結構和聯合,_Atomic類型限定符,_Thread_local存儲類說明符,Alignas說明符,Alignof運算符,Generic關鍵字等。該選項獨立於標準模式。在下面的表達式中警告被禁用__extension

-Wc+±compat (C and Objective-C only)
警告關於ISO C和ISO C ++的公共子集之外的ISO C構造,例如請求將隱式轉換void *爲非void類型指針。

-Wc++11-compat (C++ and Objective-C++ only)
警告ISO C ++ 1998和ISO C ++ 2011之間含義不同的C ++結構,例如ISO C ++ 1998中作爲ISO C ++ 2011關鍵字的標識符。此警告將打開 -Wnarrowing 並被啓用 -Wall 。

-Wc++14-compat (C++ and Objective-C++ only)
警告ISO C ++ 2011與ISO C ++ 2014之間含義不同的C ++結構。此警告由。啓用 -Wall 。

-Wc++17-compat (C++ and Objective-C++ only)
警告ISO C ++ 2014和ISO C ++ 2017之間含義不同的C ++結構。此警告由。啓用 -Wall 。

-Wcast-qual
每當指針被強制轉換時都會發出警告,以便從目標類型中刪除類型限定符。例如,警告如果a const char 被投給普通人char 。

在進行以非安全方式引入類型限定符的演員時也會發出警告。例如,鑄造char 到const char 是不安全的,因爲在這個例子:

/* p is char ** value. */
const char **q = (const char ) p;
/
Assignment of readonly string to const char * is OK. /
q = “string”;
/
Now char
pointer points to read-only memory. */
**p = ‘b’;

-Wcast-align
每當指針被施放時發出警告,以便增加目標所需的對齊。 例如,警告如果將char 爲整數只能在兩個或四個字節邊界處訪問的機器上的int 。

-Wcast-align=strict
每當指針被施放時發出警告,以便增加目標所需的對齊。例如,警告如果a char 投射到某個int 目標機器。

-Wcast-function-type
當函數指針轉換爲不兼容的函數指針時發出警告。在涉及具有可變參數列表的函數類型的轉換中,僅考慮所提供的初始參數的類型。指針類型的任何參數都與任何其他指針類型匹配。在整型任何良性的差異被忽略,就像int主場迎戰long上ILP32目標。同樣,類型限定符也被忽略。函數類型void (*) (void)是特殊的,並匹配所有內容,可用於抑制此警告。在涉及指向成員類型的指針的轉換中,只要類型轉換將指針更改爲成員類型,此警告就會發出警告。此警告由啓用-Wextra 。

-Wwrite-strings
編譯C時,給字符串常量類型,以便將一個地址複製到非指針中會產生警告。這些警告幫助您在編譯時查找可以嘗試寫入字符串常量的代碼,但前提是您在聲明和原型中使用時一直非常小心。否則,這只是一個滋擾。這就是我們沒有製造的原因const char[ length ]const char *const-Wall 請求這些警告。

編譯C ++時,警告關於從字符串文字到不再使用的轉換char *。C ++程序默認啓用此警告。

-Wcatch-value
-Wcatch-value= n (C++ and Objective-C++ only)
警告關於捕捉處理程序,不通過參考捕獲。同-Wcatch值= 1 (要麼 -Wcatch價值簡稱)警告關於被值捕獲的多態類類型。同-Wcatch值= 2警告所有類型的價值。同-Wcatch值= 3 警告所有沒有被引用捕獲的類型。 -Wcatch價值 由…啓用 -Wall 。

-Wclobbered
警告可能由longjmp或更改的變量vfork。此警告也由啓用-Wextra 。

-Wconditionally-supported (C++ and Objective-C++ only)
警告有條件支持的(C ++ 11 [intro.defs])結構。

-Wconversion
警告可能會改變值的隱式轉換。這包括實數和整數,等之間轉換abs (x)時x是double; 有符號和無符號之間的轉換,如unsigned ui = -1; 並轉換爲較小的類型,例如sqrtf (M_PI)。不要警告像abs ((int) x)和的明確轉換ui = (unsigned) -1,或者如果值沒有像轉換那樣改變abs (2.0)。有關已簽名和未簽名整數之間轉換的警告可以通過使用禁用-Wno-符號轉換 。

對於C ++,也會警告混淆用戶定義轉換的重載解析; 以及從不使用類型轉換運算符的轉換:轉換爲void,相同類型,基類或對它們的引用。在C ++中,有關已簽名和未簽名整數之間轉換的警告在默認情況下是禁用的,除非-Wsign轉換 被明確啓用。

-Wno-conversion-null (C++ and Objective-C++ only)
不要警告NULL非指針類型之間的轉換。-Wconversion空 是默認啓用的。

-Wzero-as-null-pointer-constant (C++ and Objective-C++ only)
警告當字面’ 0’用作空指針常量。這對於促進nullptr在C ++ 11中的轉換很有用。

-Wsubobject-linkage (C++ and Objective-C++ only)
如果類類型具有基類或字段類型使用匿名命名空間或依賴於沒有鏈接的類型,則發出警告。如果類型A依賴於沒有或內部鏈接的類型B,則將其定義爲多個翻譯單元將會違反ODR,因爲每個翻譯單元中B的含義不同。如果A只出現在單個翻譯單元中,則最好的方法是將其置於匿名命名空間中以使其與內部關聯。編譯器不會針對主要.C文件中定義的類型給出此警告,因爲這些警告不可能有多個定義。-Wsubobject聯動 是默認啓用的。

-Wdangling-else
警告可能會混淆分支所屬的if聲明的構造else。以下是這種情況的一個例子:

{
if (a)
if (b)
foo ();
else
bar ();
}

在C / C ++中,每個else分支都屬於最內層的可能if語句,在本例中爲if (b)。這通常不是程序員所期望的,正如上例中程序員選擇的縮進所示。當可能出現這種混淆時,GCC會在指定此標誌時發出警告。爲了消除這個警告,在最裏面的if語句周圍添加顯式大括號,這樣就else不可能屬於這個封閉if。生成的代碼如下所示:

{
if (a)
{
if (b)
foo ();
else
bar ();
}
}

此警告由啓用 -Wparentheses 。

-Wdate-time
當遇到宏或遇到警告時__TIME__,可能會阻止按位重複編譯。DATE____TIMESTAMP

-Wdelete-incomplete (C++ and Objective-C++ only)
Warn when deleting a pointer to incomplete type, which may cause undefined behavior at runtime. This warning is enabled by default.

-Wuseless-cast (C++ and Objective-C++ only)
Warn when an expression is casted to its own type.

-Wempty-body
Warn if an empty body occurs in an if , else or do while statement. This warning is also enabled by -Wextra .

-Wenum-compare
Warn about a comparison between values of different enumerated types. In C++ enumerated type mismatches in conditional expressions are also diagnosed and the warning is enabled by default. In C this warning is enabled by -Wall .

-Wextra-semi (C++, Objective-C++ only)
Warn about redundant semicolon after in-class function definition.

-Wjump-misses-init (C, Objective-C only)
如果goto語句或switch語句在變量的初始化過程中向前跳轉,或者在變量初始化後向後跳轉到標籤,則發出警告。這隻會對在聲明時初始化的變量發出警告。此警告僅支持C和Objective-C; 在C ++中,這種分支在任何情況下都是錯誤的。

-Wjump門柱-INIT 包含在內 -Wc ++ - COMPAT。它可以被禁用-Wno跳門柱-INIT 選項。

-Wsign-compare
當有符號值和無符號值之間的比較可能會在有符號值轉換爲無符號時產生錯誤結果時發出警告。在C ++中,這個警告也是由-Wall。在C中,它也被啓用-Wextra 。

-Wsign-conversion
警告可能會改變整數值符號的隱式轉換,如將有符號整數表達式分配給無符號整數變量。明確的演員沉默警告。在C中,這個選項也可以通過-Wconversion 。

-Wfloat-conversion
警告隱式轉換會降低實際值的精度。這包括從實數到整數的轉換,以及從更高精度實數到更低精度實數值的轉換。該選項也可以通過-Wconversion 。

-Wno-scalar-storage-order
不要警告涉及反向標量存儲順序的可疑構造。

-Wsized-deallocation (C++ and Objective-C++ only)
警告未定義的釋放函數的定義

void operator delete(void *)noexcept;
void operator delete [](void *)noexcept;

而沒有定義相應大小的釋放函數

void operator delete(void *,std :: size_t)noexcept;
void operator delete [](void *,std :: size_t)noexcept;

或相反亦然。啓用-Wextra 隨着 -fsized,釋放 。

-Wsizeof-pointer-div
警告兩個sizeof表達式的可疑分割,這兩個sizeof表達式將指針大小除以元素大小,這是計算數組大小的常用方法,但不能正確使用指針。此警告警告,例如關於sizeof (ptr) / sizeof (ptr[0])如果ptr不是數組,而是指針。此警告由啓用-Wall 。

-Wsizeof-pointer-memaccess
如果參數使用,則向某些字符串和內存內置函數警告可疑長度參數sizeof。例如,這個警告觸發了memset (ptr, 0, sizeof (ptr));if ptr不是一個數組,而是一個指針,並且提出了一個可能的修正或關於memcpy (&foo, ptr, sizeof (&foo)); 。 -Wsizeof指針-memaccess還會警告有關字符串複製函數的調用,strncat或者strncpy指定爲sizeof源數組的表達式。例如,在以下函數中,調用strncat將源字符串的大小指定爲邊界。這幾乎肯定是一個錯誤,因此呼叫被診斷。

void make_file(const char * name)
{
char path [PATH_MAX];
strncpy(path,name,sizeof path - 1);
strncat(path,“.text”,sizeof“.text”);

}

該 -Wsizeof指針-memaccess 選項由啓用 -Wall 。

-Wsizeof-array-argument
當sizeof運算符應用於在函數定義中聲明爲數組的參數時發出警告。C和C ++程序默認啓用此警告。

-Wmemset-elt-size
memset如果第一個參數引用一個數組,並且第三個參數是一個等於元素數的數字,但不等於內存中數組的大小,則警告對內置函數的可疑調用。這表明用戶已經省略了元素大小的乘法。此警告由啓用-Wall 。

-Wmemset-transposed-args
memset如果第二個參數不爲零且第三個參數爲零,則警告對內置函數的可疑調用。這警告了例如memset (buf, sizeof buf, 0)最可能的memset (buf, 0, sizeof buf)意思。只有第三個參數爲零時纔會發出診斷信息。如果它的某個表達式被摺疊爲零,對於某種類型的零等等,則用戶錯誤地交換參數並且不發出警告的可能性就小得多。此警告由啓用-Wall 。

-Waddress
警告內存地址的可疑使用。這些包括在一個條件表達式中使用一個函數的地址,比如void func(void); if (func),和一個字符串文字的內存地址比較,比如if (x == “abc”)。這種用法通常表示程序員錯誤:函數的地址總是計算爲真,因此它們在條件中的使用通常表示程序員在函數調用中忘記了括號; 並且與字符串文字的比較導致未指定的行爲並且在C中不可移植,所以它們通常表示程序員打算使用strcmp。此警告由啓用-Wall 。

-Wlogical-op
在表達式中警告邏輯運算符的可疑用法。這包括在可能期望按位運算符的上下文中使用邏輯運算符。此外還警告邏輯運算符的操作數是否相同:

extern int a;
if (a < 0 && a < 0) { … }

-Wlogical-not-parentheses
警告關於邏輯不用在比較的左側操作數上。如果右操作數被認爲是布爾表達式,該選項不會警告。其目的是檢測如下的可疑代碼:

int a;

if (!a > 1) { … }

可以通過將LHS包括在括號中來抑制警告:

if ((!a) > 1) { … }

此警告由啓用 -Wall 。

-Waggregate-return
警告是否定義或調用了返回結構或聯合的任何函數。(在可以返回數組的語言中,這也會引發警告。)

-Wno-aggressive-loop-optimizations
如果在具有恆定迭代次數的循環中發出警告,編譯器在一次或多次迭代過程中檢測到某些語句中的未定義行爲。

-Wno-attributes
不要警告是否使用了意外__attribute__情況,例如無法識別的屬性,應用於變量的功能屬性等。這不會阻止錯誤使用受支持屬性的錯誤。

-Wno-builtin-declaration-mismatch
如果使用錯誤的簽名或非功能聲明瞭內置函數,則發出警告。該警告默認啓用。

-Wno-builtin-macro-redefined
如果某些內置宏被重新定義,請不要警告。這抑制了警告的重新定義__TIMESTAMP__,TIMEDATEFILE,和__BASE_FILE__。

-Wstrict-prototypes (C and Objective-C only)
警告如果一個函數被聲明或定義而沒有指定參數類型。(如果前面有指定參數類型的聲明,則允許舊式函數定義不帶警告。)

-Wold-style-declaration (C and Objective-C only)
根據C標準,在聲明中警告過時的用法。例如,警告存儲類說明符static不是聲明中的第一件事情。此警告也由啓用-Wextra 。

-Wold-style-definition (C and Objective-C only)
如果使用舊式函數定義,則發出警告。即使存在以前的原型,也會發出警告。

-Wmissing-parameter-type (C and Objective-C only)
在K&R樣式函數中聲明函數參數時沒有類型說明符:

void foo(bar){}
1
此警告也由啓用 -Wextra 。

-Wmissing-prototypes (C and Objective-C only)
警告如果沒有先前的原型聲明定義全局函數。即使定義本身提供了原型,也會發出此警告。使用此選項可檢測頭文件中沒有匹配原型聲明的全局函數。此選項對C ++無效,因爲所有函數聲明都提供了原型,而非匹配聲明聲明瞭重載而不是與先前的聲明衝突。使用-Wmissing申述 在C ++中檢測缺少的聲明。

-Wmissing-declarations
警告如果沒有先前的聲明定義全局函數。即使定義本身提供了原型,也是如此。使用此選項可檢測未在頭文件中聲明的全局函數。在C中,對於以前的非原型聲明的函數不會發出警告; 使用-Wmissing的原型檢測丟失的原型。在C ++中,不會爲函數模板,內聯函數或匿名命名空間中的函數發出警告。

-Wmissing-field-initializers
如果結構的初始化程序缺少某些字段,則發出警告。例如,下面的代碼會導致這樣的警告,因爲xh它隱含地爲零:

struct s {int f,g,h; };
struct sx = {3,4};
1
2
此選項不會警告指定的初始化程序,因此以下修改不會觸發警告:

struct s {int f,g,h; };
struct sx = {.f = 3,.g = 4};

在C中,這個選項不會警告通用零初始化器’ {0} “:

struct s {int f,g,h; };
struct sx = {0};

同樣,在C ++中,此選項不會警告空{}初始化程序,例如:

struct s {int f,g,h; };
sx = {};

此警告包含在中 -Wextra。獲得其他-Wextra 沒有這個警告,使用 -Wextra -Wno-missing-field-initializers 。

-Wno-multichar
不要警告如果多字符常量(’ ‘FOOF”) 用來。通常,它們表示用戶代碼中存在拼寫錯誤,因爲它們具有實現定義的值,不應將其用於可移植代碼中。

-Wnormalized= [ none | id | nfc | nfkc ]
在ISO C和ISO C ++中,如果兩個標識符是不同的字符序列,則它們是不同的。但是,有時使用基本ASCII字符集之外的字符時,可以有兩個看起來相同的不同字符序列。爲避免混淆,ISO 10646標準規定了一些規範化規則,在應用時確保兩個看起來相同的序列變成相同的序列。如果您使用尚未正常化的標識符,GCC可以警告您; 該選項控制該警告。

GCC支持四級警告。默認是-Wnormalized = NFC,它警告任何非ISO 10646“C”規範化形式的標識符NFC。NFC是大多數用途的推薦形式。這相當於-Wnormalized 。

不幸的是,ISO C和ISO C ++在標識符中允許有一些字符在變成NFC時不允許用於標識符。也就是說,無法在便攜式ISO C或C ++中使用這些符號,並且在NFC中使用所有標識符。-Wnormalized = ID抑制這些字符的警告。希望未來版本的標準能夠糾正這個問題,這就是爲什麼這個選項不是默認選項。

您可以通過書寫來關閉所有角色的警告 -Wnormalized =無 要麼 -Wno標準化。如果您使用其他規範化方案(如“D”),則只應執行此操作,否則您可以輕鬆創建幾乎不可能看到的錯誤。

ISO 10646中的一些字符具有不同的含義,但在某些字體或顯示方法中看起來完全相同,尤其是在應用格式化之後。例如\u207F,“SUPERSCRIPT LATIN SMALL LETTER N”,就像一個n放在上標中的常規一樣顯示。ISO 10646定義了NFKC規範化方案,將所有這些轉換爲標準格式,如果您使用的代碼不在NFKC中,GCC會發出警告-Wnormalized = nfkc。此警告與包含字母O的每個標識符的警告相當,因爲它可能與數字0混淆,所以不是默認值,但如果編程環境無法修復以顯示這些內容,則可能作爲本地編碼約定有用字符清晰。

-Wno-deprecated
不要警告使用已棄用的功能。請參閱棄用功能。

-Wno-deprecated-declarations
不要警告使用屬性標記爲棄用的函數(請參閱函數屬性),變量(請參閱變量屬性)和類型(請參閱類型屬性)deprecated。

-Wno-overflow
不要警告常量表達式中的編譯時溢出。

-Wno-odr
在鏈接時間優化期間警告一個定義規則違規。需要-flto-ODR型合併 啓用。 默認啓用。

-Wopenmp-simd
如果向量化器成本模型覆蓋用戶設置的OpenMP simd指令,則發出警告。該-fsimd成本模型=無限 選項可以用來放寬成本模型。

-Woverride-init (C and Objective-C only)
如果在使用指定初始值設定項時覆蓋沒有副作用的初始化域,請警告(請參閱指定初始值設定項)。

此警告包含在中 -Wextra。獲得其他-Wextra 沒有這個警告,使用 -Wextra -Wno-override-init 。

-Woverride-init-side-effects (C and Objective-C only)
警告如果使用指定的初始值設定項時會覆蓋具有副作用的初始化字段(請參閱指定的初始值設定項)。該警告默認啓用。

-Wpacked
如果給定結構的打包屬性,但打包的屬性對結構的佈局或大小沒有影響,則警告。這樣的結構可能會失去對齊的好處。例如,在這段代碼中,變量fxin struct bar沒有對齊,儘管struct bar它本身沒有packed屬性:

struct foo {
int x;
char a,b,c,d;
} __attribute __((packed));
結構欄{
char z;
struct foo f;
};

-Wpacked-bitfield-compat
GCC的4.1,4.2和4.3系列忽略了packed類型位字段上的屬性char。這已經在GCC 4.4中得到了修復,但是這種改變會導致結構佈局的差異。當GCC 4.4中這個字段的偏移已經改變時,GCC會通知你。例如,字段a和b結構之間不再有4位填充:

struct foo
{
char a:4;
char b:8;
} attribute((packed));

該警告默認啓用。使用-Wno-填充位字段,COMPAT 禁用此警告。

-Wpacked-not-aligned (C, C++, Objective-C and Objective-C++ only)
如果在打包結構或聯合中顯式指定對齊的結構字段未對齊,則警告警告。例如,在此代碼中將會發出警告struct S,如warning: alignment 1 of ‘struct S’ is less than 8:

struct attribute((aligned(8)))S8 {char a [8]; };
struct attribute((packed))S {
struct S8 s8;
};

此警告由啓用 -Wall 。

-Wpadded
警告如果填充包含在結構中,則要對齊結構的某個元素或對齊整個結構。有時候發生這種情況時,可以重新排列結構的字段以減少填充,從而使結構更小。

-Wredundant-decls
如果在同一範圍內多次聲明任何內容,即使在多重聲明有效且不做任何更改的情況下也會發出警告。

-Wno-restrict
當由一個restrict-qualified參數引用的對象(或者在C ++中,一個__restrict-qualified參數)被另一個參數別名時,或者當這些對象之間的副本重疊時引發警告。例如,對strcpy下面函數的調用嘗試通過用最後四個字符替換其初始字符來截斷字符串。但是,由於呼叫將終止NUL寫入a[4],副本重疊並且呼叫被診斷。

void foo(void)
{
char a [] =“abcd1234”;
strcpy(a,a + 4);

}

該 -Wrestrict 選項檢測到一些簡單重疊的情況,即使沒有進行優化,但最適用於 -02以上。它包含在中-Wall 。

-Wnested-externs (C and Objective-C only)
警告如果extern在函數中遇到聲明。

-Wno-inherited-variadic-ctor
當繼承的基類具有C可變參數構造函數時,禁止使用C ++ 11繼承構造函數的警告; 警告默認打開,因爲省略號不被繼承。

-Winline
警告如果聲明爲內聯的函數不能內聯。即使使用此選項,編譯器也不會警告內聯函數在系統頭文件中聲明的函數失敗。

編譯器使用各種啓發式來確定是否內聯一個函數。例如,編譯器考慮了內聯函數的大小以及當前函數中已經完成的內聯量。因此,源程序中看似微不足道的變化可能會導致警告-Winline 出現或消失。

-Wno-invalid-offsetof (C++ and Objective-C++ only)
禁止將offsetof宏應用於非POD類型的警告。根據2014年ISO C ++標準,應用於offsetof非標準佈局類型是未定義的。然而,在現有的C ++實現中,offsetof通常會給出有意義的結果。此標誌適用於意識到他們正在編寫非易用代碼並且故意選擇忽略有關警告的用戶。

offsetof在未來的C ++標準版本中,這些限制可能會放寬。

-Wint-in-bool-context
在可能使用布爾值的情況下警告使用整數值,例如條件表達式(?:)在布爾上下文中使用非布爾整型常量,例如if (a <= b ? 2 : 3)。或者在布爾上下文中左移有符號整數,如for (a = 0; 1 << a; a++); 。同樣,對於所有類型的乘法,無論數據類型如何。此警告由啓用-Wall 。

-Wno-int-to-pointer-cast
將強制轉換的警告抑制爲不同大小整數的指針類型。在C ++中,轉換爲較小大小的指針類型是錯誤的。溫特對指針的投 是默認啓用的。

-Wno-pointer-to-int-cast (C and Objective-C only)
禁止來自指針的強制轉換爲不同大小整數類型的警告。

-Winvalid-pch
警告如果在搜索路徑中找到預編譯頭(請參閱預編譯頭),但無法使用。

-Wlong-long
警告如果使用long long類型。這是由任一啓用-Wpedantic 要麼 -Wtraditional在ISO C90和C ++ 98模式下。要禁止警告消息,請使用-Wno-長隆 。

-Wvariadic-macros
如果在ISO C90模式下使用可變宏,或者在ISO C99模式下使用GNU替代語法,則發出警告。這是由任一啓用-Wpedantic 要麼 -Wtraditional。要禁止警告消息,請使用-Wno-可變參數的宏 。

-Wvarargs
警告用於處理可變參數的宏的可疑用法va_start。這是默認設置。 要禁止警告消息,請使用 -Wno-可變參數 。

-Wvector-operation-performance
如果矢量操作未通過體系結構的SIMD功能實現,則發出警告。主要用於性能調整。可以實現向量操作piecewise,這意味着標量操作在每個向量元素上執行; in parallel,這意味着向量操作是使用更寬類型的標量來實現的,這通常是更高的性能效率; 並且as a single scalar,這意味着矢量裝配到一個標量類型。

-Wno-virtual-move-assign
使用非平凡的C ++ 11移動賦值運算符來抑制有關從虛擬基礎繼承的警告。這是很危險的,因爲如果虛擬基地沿着多條路徑可到達,它會多次移動,這可能意味着兩個對象最終都處於移動狀態。如果寫入移動賦值運算符以避免從移出的對象移動,則可以禁用此警告。

-Wvla
如果代碼中使用了可變長度的數組,則會發出警告。 -Wno-VLA 防止 -Wpedantic 警告變長數組。

-Wvla-larger-than= n
如果使用此選項,編譯器將警告使用可變長度數組,其大小要麼是無限的,要麼是大於n字節的參數。這與如何相似-Walloca-greater-than = n 工作,但與變長數組。

請注意,GCC可能會將已知值的小型可變長度數組優化爲普通數組,因此可能無法觸發此警告。

此警告未啓用 -Wall ,並且只在有效時纔有效 -ftree-VRP 是活動的(默認爲 -02 以上)。

也可以看看 -Walloca-greater-than = n 。

-Wvolatile-register-var
如果寄存器變量被聲明爲volatile,則發出警告。volatile修飾符不會禁止可能會消除讀取和/或寫入寄存器變量的所有優化。此警告由啓用-Wall 。

-Wdisabled-optimization
如果請求的優化傳遞被禁用,則發出警告。此警告通常並不表示您的代碼有任何問題; 它只是表明GCC的優化器無法有效處理代碼。通常,問題在於你的代碼太大或太複雜; 當優化本身可能花費過多時間時,GCC拒絕優化程序。

-Wpointer-sign (C and Objective-C only)
警告指針參數傳遞或具有不同簽名的分配。該選項僅支持C和Objective-C。它暗示着-Wall 並通過 -Wpedantic ,可以禁用 -Wno指針-SIGN 。

-Wstack-protector
該選項僅在激活時纔有效 -fstack保護器活躍。它警告那些不能防止堆棧粉碎的功能。

-Woverlength-strings
警告字符串常量的長度超過C標準中指定的“最小最大長度”。現代編譯器通常允許比標準的最小限制長得多的字符串常量,但是非常便攜的程序應該避免使用更長的字符串。

該限制適用於字符串常量級聯之後,並且不計算尾隨NUL。在C90中,限制爲509個字符; 在C99中,它被提升到了4095. C ++ 98沒有規定最小最大規範,所以我們不用診斷C ++中的超長字符串。

這個選項是隱含的 -Wpedantic ,並可以禁用 -Wno-超長串 。

-Wunsuffixed-float-constants (C and Objective-C only)
對任何沒有後綴的浮動常量發出警告。與…一起使用時-Wsystem報頭它會在系統頭文件中警告這些常量。在準備代碼以使用FLOAT_CONST_DECIMAL64從C99到十進制浮點擴展的編譯指示時,這非常有用。

-Wno-designated-init (C and Objective-C only)
使用位置初始化程序初始化已標記了designated_init屬性的結構時,禁止警告。

-Whsa
當編譯的函數或OpenMP構造不能釋放HSAIL時發出警告。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章