我有两个单元的简单程序:
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
的标题,无论如何它都会编译。为什么我必须包含标题?
答案 0 :(得分:1)
该程序具有未定义的行为。
根据C标准(6.5.2.2函数调用)
- ..如果参数数量不等于参数数量,则行为未定义。
醇>
该函数被定义为没有参数,但是用一个参数调用。
来自C标准(6.7.6.3函数声明符(包括原型))
14 ....函数声明符中的空列表,它是定义的一部分 该函数指定函数没有参数。
在C ++中,此代码无法编译。