函数调用C

可能重复:
为什么gcc允许将参数传递给定义为不带参数的函数?

代码:

#include  #include  void test_print() { printf("test print\n"); } int main() { test_print(1,2); return 0; } 

尽管main中test_print的调用者具有不同数量的参数并且具有该函数的定义,但代码可以很好地工作,但是如果将其更改为c ++版本,则会出现编译错误“funciton的参数太多……”。 。 为什么C允许参数不匹配调用函数,何时可以使用这种调用方式? 以及为什么它在c ++中被禁止。

系统ubuntu 11.10
编译器:gcc 4.6.1

在函数中的c empty ()意味着该函数可以使用任意数量的参数。
如果要指定该函数不需要任何参数,则需要:

 void test_print(void) 

而在C ++中,函数上的empty ()意味着它不带任何参数。 请注意,这在C ++中很重要,因为在C ++中,您可以根据可以采用的参数数量来重载函数。

因为符合C标准;

 int foo(void); //Is the only way a function won't allow any parameters 

引用标准:

10 void类型的未命名参数作为列表中唯一项的特殊情况指定该函数没有参数。

将括号留空意味着不包含任意数量或任意数量的参数。

当你写:

 void test_print() { ... } 

你还没有为函数提供原型,所以编译器不应该将调用与参数列表进行比较。 要提供原型,您必须编写一个明确的void

 void test_print(void) { ... } 

或者提供单独的原型声明:

 void test_print(void); 

但最好使函数定义与原型声明匹配,因此总是写出void 。 是的,这是C ++与C不同的领域之一。如果没有原型,C ++就不能在C中使用函数,C ++能够将空参数列表视为空参数列表。 在C99或更高版本中,你应该在范围内有一个原型,但除非你添加更严格的选项,否则它通常不会被编译器强制执行( -Wmissing-prototypes -Wstrict-rprototypes -Wold-style-definition -Wold-style-declaration是可能的GCC选项)。 但是,对于预标准C的向后兼容性要求意味着C89无法在不破坏大量先前有效的C代码的情况下强制执行“空括号意味着无参数”规则,这将阻止标准被接受。

这是一个很好的编程规则,可以确保找到编译器选项,确保在使用之前使用完整原型声明所有函数,并确保始终使用编译器选项,并注意其警告