Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解C语言中的函数原型 代码如下:_C_Function Prototypes - Fatal编程技术网

理解C语言中的函数原型 代码如下:

理解C语言中的函数原型 代码如下:,c,function-prototypes,C,Function Prototypes,以前 可能因为实际参数被提升为double而不起作用,这与函数定义不匹配,对吗 之后 工作。当编译器可以检查数据类型时,为什么不能检查参数的数量?根据定义,哪一个只能是两个 另外,允许非原型的意义是什么 void fun(); 当它们不帮助检查函数调用时传递的参数时,它们有什么区别?为什么支持它们 谢谢:)两者都应该无法编译;你在用什么编译器 另外-您没有使用功能原型;函数原型是调用前被调用函数的规范,两者都不能编译;你在用什么编译器 另外-您没有使用功能原型;函数原型是调用前被调用函数的规范,

以前

可能因为实际参数被提升为double而不起作用,这与函数定义不匹配,对吗

之后

工作。当编译器可以检查数据类型时,为什么不能检查参数的数量?根据定义,哪一个只能是两个

  • 另外,允许非原型的意义是什么
    void fun()
    ; 当它们不帮助检查函数调用时传递的参数时,它们有什么区别?为什么支持它们

  • 谢谢:)

    两者都应该无法编译;你在用什么编译器


    另外-您没有使用功能原型;函数原型是调用前被调用函数的规范,两者都不能编译;你在用什么编译器


    另外-您没有使用功能原型;函数原型是调用前被调用函数的规范,它可以正确编译。您正在调用一个未定义的函数,它在现代编译器上是一个警告

    它将自动将float提升为double、char和short,并假定返回int

    第二个示例即使参数数量错误也能工作,因为参数太多了,正常的调用约定会默默地纠正这一点


    虚无乐趣();是一个旧式原型,它只声明返回类型,而不说明参数。

    编译正确。您正在调用一个未定义的函数,它在现代编译器上是一个警告

    它将自动将float提升为double、char和short,并假定返回int

    第二个示例即使参数数量错误也能工作,因为参数太多了,正常的调用约定会默默地纠正这一点

    虚无乐趣();是一个旧式的原型,它只声明返回类型,而不说明参数。

    原型必须出现在函数调用之前才有用;在调用函数之前定义该函数:

    void fun (float x, float y) {} // IMPLICIT TYPING IS BAD JUJU!
    
    int main(void) // Unless the documentation for your compiler *explicitly* says
                   // that "void main()" is a legal signature, main should
                   // always return int.
    {
      float x;
      fun(x,x,x);
      return 0;
    }
    
    或单独声明:

    int main(void)
    {
      void fun(float x, float y);
      float x;
      fun(x,x,x);
      return 0;
    }
    
    void fun(float x, float y) {}
    
    我喜欢第一个版本

    原型必须出现在函数调用之前才有用;在调用函数之前定义该函数:

    void fun (float x, float y) {} // IMPLICIT TYPING IS BAD JUJU!
    
    int main(void) // Unless the documentation for your compiler *explicitly* says
                   // that "void main()" is a legal signature, main should
                   // always return int.
    {
      float x;
      fun(x,x,x);
      return 0;
    }
    
    或单独声明:

    int main(void)
    {
      void fun(float x, float y);
      float x;
      fun(x,x,x);
      return 0;
    }
    
    void fun(float x, float y) {}
    

    我喜欢第一个版本

    其他人已经解释了为什么它会这么做,但值得一提的是,这就是为什么许多C程序都是自下而上读取的。下面将有正确和预期的结果(main的返回类型是
    int
    ,但这只是迂腐):


    通过按这样的顺序定义函数,您可以消除对几乎所有函数的原型需求(交互递归是一个例外)。然后,您可以将API函数的原型放在标题中,并保持本地函数的静态。

    其他人已经解释了为什么它会这样做,但值得一提的是,这就是为什么许多C程序是自下而上读取的。下面将有正确和预期的结果(main的返回类型是
    int
    ,但这只是迂腐):

    通过按这样的顺序定义函数,您可以消除对几乎所有函数的原型需求(交互递归是一个例外)。然后,您可以将API函数的原型放在头中,并保持本地函数的静态

    当编译器可以检查数据类型时,为什么不能检查参数的数量?根据定义,参数的数量必须只有两个

    这是未定义的行为。编译器允许您这样做,因为它假定您知道自己在做什么。如果您设置了警告级别,但没有收到警告,我会切换到另一个编译器。假设你知道自己在做什么是一回事。但假设你没有犯任何错误是另一回事,因为你没有警告你。正如你已经指出的,这在技术上是可行的,而且并不困难

    允许像void fun()这样的非原型有什么意义;当它们不帮助检查函数调用时传递的参数时,它们有什么区别?为什么支持它们

    首先,它们是为了向后兼容。旧的前标准C没有原型。其次,使用不包含原型的函数指针可能很有用:

    void f(int i) { /* ... */ }
    void g(double d) { /* ... */ }
    
    int main(void) {
      typedef void ftype();
      ftype *ptr[] = { &f, &g };
      ptr[0](42);
      ptr[1](3.1415);
    }
    
    该代码是有效的,其行为定义良好

    当编译器可以检查数据类型时,为什么不能检查参数的数量?根据定义,参数的数量必须只有两个

    这是未定义的行为。编译器允许您这样做,因为它假定您知道自己在做什么。如果您设置了警告级别,但没有收到警告,我会切换到另一个编译器。假设你知道自己在做什么是一回事。但假设你没有犯任何错误是另一回事,因为你没有警告你。正如你已经指出的,这在技术上是可行的,而且并不困难

    允许像void fun()这样的非原型有什么意义;当它们不帮助检查函数调用时传递的参数时,它们有什么区别?为什么支持它们

    首先,它们是为了向后兼容。旧的前标准C没有原型。其次,使用不包含原型的函数指针可能很有用:

    void f(int i) { /* ... */ }
    void g(double d) { /* ... */ }
    
    int main(void) {
      typedef void ftype();
      ftype *ptr[] = { &f, &g };
      ptr[0](42);
      ptr[1](3.1415);
    }
    
    该代码是有效的,其行为定义良好

    我会再次回答(希望不要被扣分)。因为你看起来还是很困惑

    C语言遗产也混淆了这一点,因为在早期版本的C中,有些东西是被允许的,现在被认为是不好的做法。但出于兼容性原因,它们仍然是允许的。C++不允许它们(因此我在我的另一个答案中)。< /P> 首先要知道的是C和C++读取源代码。
    fun(x,x,x);
    
    x.cpp: In function ‘int main()’:
    x.cpp:4: error: ‘fun’ was not declared in this scope
    
    void fun(float, float);
    
    fun(x,x,x);