2017-11-10 244 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:是的,我知道,我明确承认它。我提供了一个更好的解决方案的基本问题。 –

相关问题