关于错误的函数参数没有编译错误

时间:2016-01-11 17:24:34

标签: c gcc

我有两个单元的简单程序:

count_words.c:

int main( int argc, char ** argv )
{
    printf("starting\n");
    int i =  aaa(55555);
    printf("%d",i);
    printf("ending\n");
    return i;
}

clean.c:

int aaa()
{
    printf("aaa\n");
    return 5;
}

生成文件:

count_words:  clean.o count_words.o  -lfl
        gcc count_words.o clean.o -lfl -ocount_words 

%.o:%.c
        gcc -c -o $@ $<

我想知道为什么这段代码编译并运行没有问题。 aaa()中的函数clean.c没有参数,但在count_words.c中我传递55555。为什么编译和运行。在这种情况下,我可以预料到意外错误吗?

UPD:

我已将int aaa()更改为int aaa(void),但仍有警告而非错误。

正如您所注意到的,我在clean.c中未包含count_words.c的标题,无论如何它都会编译。为什么我必须包含标题?

1 个答案:

答案 0 :(得分:1)

该程序具有未定义的行为。

根据C标准(6.5.2.2函数调用)

  
      
  1. ..如果参数数量不等于参数数量,则行为未定义。
  2.   

该函数被定义为没有参数,但是用一个参数调用。

来自C标准(6.7.6.3函数声明符(包括原型))

  

14 ....函数声明符中的空列表,它是定义的一部分   该函数指定函数没有参数

在C ++中,此代码无法编译。