4

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

编码:

#include <stdio.h>
#include <stdlib.h>

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

int main()
{
    test_print(1,2);
    return 0;
}

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

系统 ubuntu 11.10
编译器:gcc 4.6.1

4

4 回答 4

4

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

void test_print(void) 

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

于 2012-12-26T06:45:43.987 回答
3

因为根据C标准;

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

引用标准:

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

将括号留空意味着没有参数或任何数量的参数。

于 2012-12-26T06:46:10.277 回答
2

当你写:

void test_print() { ... }

您没有为函数提供原型,因此编译器不应该将调用与参数列表进行比较。要提供原型,您必须编写显式void

void test_print(void) { ... }

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

void test_print(void);

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

于 2012-12-26T06:50:00.170 回答
0

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

于 2012-12-26T06:48:24.227 回答