2016-04-01 33 views
3

我通常使用-Werror編譯我的項目並打開一些警告(如-Wsequence-point -Wcast-align -Wstrict-prototypes -Wstrict-aliasing)。爲系統標題禁用某些警告

使用這些設置,在某些平臺上,某些標頭在包含時會產生警告(由於第一個開關而變成錯誤)。例如,我在MacOS上看到了一些X11頭文件。

我不想降低我的代碼的質量標準。有沒有辦法在不禁用全球有問題的警告的情況下編譯我的項目?例如,是否有一種方法可以禁用僅包含我的項目中包含的標題的警告?

編輯

這裏是我試圖解決這個問題的一個例子:

gcc -std=c99 -pthread -O2 -fstrict-aliasing -I/usr/X11/include -Werror -Wpedantic -Wstrict-aliasing -Wchar-subscripts -Wimplicit -Wsequence-point -Wwrite-strings -Wunused-variable -Wvla -c -o main.o main.c 
/usr/X11/include/X11/Xfuncproto.h:145:24: error: named variadic macros are a GNU extension [-Werror,-Wvariadic-macros] 
#define _X_NONNULL(args...) __attribute__((nonnull(args))) 
+2

忘記了[HERE](https://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html) – LPs

+1

不是['-Wno-system-headers'](https:// gcc。 gnu.org/onlinedocs/gcc-5.3.0/gcc/Warning-Options.html#index-Wno-system-headers-437)默認? – DevSolar

+2

@LPs:「這裏」 - 鏈接已被棄用,因爲幾乎是HTML的發明。 「GCC的診斷編譯指南」將是一個很好的鏈接文本。 ;-) – DevSolar

回答

1

Options for Directory Search名單GCC手冊:

這些選項指定的目錄搜索頭文件,用於庫和編譯器的某些部分:

-I dir
-iquote dir
-isystem dir
-idirafter dir

目錄dir添加到目錄的列表預處理過程中搜索頭文件。如果dir以'='開始,則'='被替換爲sysroot前綴;見--sysroot-isysroot

使用-iquote指定的目錄僅適用於指令的報價表,#include "file"。使用-I,-isystem-idirafter指定的目錄適用於查找#include "file"#include <file>指令。

您可以在命令行上指定任意數量或這些選項的組合來搜索多個目錄中的頭文件。查找順序如下:

  • 對於include指令的報價表格,首先搜索當前文件的目錄。
  • 對於include指令的引用形式,由-iquote選項指定的目錄按照從左到右的順序搜索,因爲它們出現在命令行上。
  • 使用-I選項指定的目錄按從左到右的順序掃描。
  • -isystem選項指定的目錄按從左到右的順序掃描。
  • 掃描標準系統目錄。
  • -idirafter選項指定的目錄按從左到右的順序掃描。

您可以使用-I覆蓋系統頭文件,替換自己的版本,因爲這些目錄是在標準系統頭文件目錄之前搜索的。但是,您不應該使用此選項來添加包含供應商提供的系統頭文件的目錄;爲此,使用-isystem

-isystem-idirafter選項也將該目錄標記爲系統目錄,以便它可以得到與應用於標準系統目錄相同的特殊處理。

如果標準系統包含目錄或用-isystem指定的目錄也用-I指定,則-I選項將被忽略。該目錄仍然在系統包含鏈中的正常位置上作爲系統目錄進行搜索。這是爲了確保海灣合作委員會的程序,以解決有問題的系統標題和#include_next指令的排序不會無意中更改。如果您確實需要更改系統目錄的搜索順序,請使用-nostdinc和/或-isystem選項。

引用的第二個最後一段指出,指定具有-isystem的目錄可以抑制任何其他系統標頭(默認情況下)的警告。

手冊的Options to Request or Suppress Warnings部分包括:

-Wsystem-headers

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

所以,通過指定包含/usr/X11/include/X11/Xfuncproto.h文件作爲一個系統目錄的目錄:

-isystem /usr/X11/include 

你不應該得到#include <X11/Xfuncproto.h>警告了。