2017-11-10 187 views
-1

我想讓編譯器警告warning: too many arguments in call to 'IF'出錯(其中IF是函數)。在函數中調用``太多的參數'在Clang中出現錯誤

我在配置clang時遇到了問題,因爲我找不出實際的警告名稱。

我試過如下:

clang -Werror=too-many-arguments main.c 

warning: unknown warning option '-Werror=too-many-arguments'; did you mean '-Werror=unknown-argument'? 
    [-Wunknown-warning-option] 

但這只是產生上述警告。

隨着

clang -Werror main.c 

警告不會成爲一個錯誤,但我試圖讓只有這個特定的警告的錯誤。

如何找到此編譯器警告的名稱,以便我可以將其提升爲編譯器錯誤?

謝謝。

+2

我以某種方式懷疑這是一個警告,你可以禁用;作爲語言語法的問題,調用具有與原型不匹配的參數列表的函數在C中是非法的。 –

+2

@DavidHoelzer我認爲這與OP所詢問的是相反的...... –

+2

@DavidHoelzer我正在嘗試將警告提示錯誤。 – sbdchd

回答

2

我檢查Subversion中的電流源和發現這一點:test/Misc/warning-flags.c在鐺源列表warn_call_wrong_number_of_arguments(此警告的內部碼),這意味着,它預計這種警告沒有單獨-W標誌。我相信Clang開發人員會接受一個爲此選項引入明確名稱的修補程序。

但在此之前,-Werror是你自己的選擇。

1

-Werror正在轉動全部警告錯誤。除了您感興趣的特定區域外,您可以關閉所有警告,但在如此多的層次上這是錯誤的,我只是出於學術原因提及它。

您可能還會考慮獲得良好皮棉,如Gimpel的FlexeLint產品。這是一種可完全配置的警告,錯誤和信息消息。

0

這並不直接回答你的問題,但我相信我可以提供比你想要的更好的解決方案。

此:

void test() { 
    printf("test\n"); 
} 

是一箇舊式非原型函數定義。作爲一個定義,它指定該函數沒有參數,但作爲一個聲明,它沒有指定任何期望的參數的數量和類型。根據此定義,錯誤地傳遞參數(例如test("test")test(42))的調用不是違反約束條件,並且不需要診斷,即使這樣的調用在評估後也有未定義的行爲。

鏗鏘聲越來越超出語言要求,以警告您錯誤的呼叫。 (我感到十分詫異它這樣做。GCC,例如,沒有。)

這種事情也正是爲什麼原型在1989年加入到語言回來。正如你在這個問題提了,你可以定義函數是這樣的:

void test(void) { 
    printf("test\n"); 
} 

鑑於這個定義是可見的,符合標準的編譯器必須診斷任何企圖用一個或多個參數不正確地調用這個函數。

解決您的問題的方法不是哄編譯器診斷語言不需要診斷的問題。這是修復代碼。很少有很好的理由而不是使用所有函數聲明和定義的原型。

舊式的聲明和定義過時,但他們仍然是合法的,即使在2011版ISO下的(我個人認爲這是不幸的。)

(你說你不想指定void作爲參數,但你沒有解釋爲什麼。)

+0

問題是如何讓clang把你的第一個例子當作錯誤。 – cdignam

+0

@cdignam:是的,我知道,我明確承認它。我提供了一個更好的解決方案的基本問題。 –

相關問題