【问题标题】:function call in C [duplicate]C中的函数调用[重复]
【发布时间】:2012-12-26 06:42:34
【问题描述】:

可能重复:
Why does gcc allow arguments to be passed to a function defined to be with no arguments?

代码:

#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

【问题讨论】:

  • 在 C99 中,这会调用未定义的行为。请参阅:C99 6.5.2.2/6 如果表示被调用函数的表达式具有不包含原型的类型,则对每个参数执行整数提升,并且具有浮点类型的参数提升为双精度。这些称为默认参数提升。如果参数的数量不等于参数的数量,则行为未定义。

标签: c function


【解决方案1】:

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

void test_print(void) 

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

【讨论】:

    【解决方案2】:

    因为按照C标准;

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

    引用标准:

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

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

    【讨论】:

      【解决方案3】:

      当你写作时:

      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 代码的情况下强制执行“空括号意味着没有参数”规则,这会导致该标准无法被接受。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多