【问题标题】:What does an empty parameter list mean? [duplicate]空参数列表是什么意思? [复制]
【发布时间】:2013-08-12 14:34:57
【问题描述】:

我目前正在阅读的书指出,当您在 c 中声明一个不接受任何参数但不使用关键字 void 的函数时,函数调用可以传递任何 它想要的论点”。所以我尝试了这个。

int number();

int main(void)
{
    int x =1;
    printf("%d",number(x));
}

int number()
{
    return x;
}

但它没有编译???这是如何工作的?

【问题讨论】:

  • number() 从哪里得到x?与您关于func(void)func() 之间的C 差异的实际问题相关,请参阅this q&a
  • 这是什么书?我猜这本书要么是错的,要么是——更合理地过时了。

标签: c parameters arguments


【解决方案1】:

这是几十年前 C 标准化之前的一个过时功能1

永远不要使用它。

在你出生前十年的古代 C 语言中,你可以声明一个没有参数的函数。当你调用它时,编译器会将参数提升为默认类型并将它们传递给函数。本质上,编译器从调用中的参数中找出了参数声明。

函数仍应定义带有参数,并且它们应与调用函数的方式相匹配。


1 “特征”是错误的词。这是当时做事的方式,因为尚未广泛开发更好的方式。在新的编程语言中,这种特性会被认为是一种缺陷。

【讨论】:

    【解决方案2】:

    为了支持 Eric Postpischil 的回答,我想引用 C11 标准(6.11 未来语言方向

    6.11.6 函数声明符

    使用带空括号的函数声明符(不是 原型格式参数类型声明符)已过时 功能。

    6.11.7 函数定义

    使用带有单独参数标识符的函数定义和 声明列表(不是原型格式的参数类型和标识符 声明符)是一个过时的功能。

    重点是我的:)

    【讨论】:

      【解决方案3】:

      这里的问题是你的函数号不知道 x。
      也就是说,当你有函数号返回 x 时,它在范围内没有任何 x 要返回,所以这是一个编译错误。相反,如果您写道:

      int number() {
          return 5;
      }
      

      它会编译得很好。

      【讨论】:

      • 我猜你的意思是如果你将参数传递给这样的函数,你不能在函数内部访问它们?
      • 是的,完全正确。我看不出这个有多大用处,但我想如果你有一个函数指针数组,其中大多数都带有一组特定的参数,其中一个没有参数,你可以声明一个取 () 而不是(void) 以便每次都能使用相同的参数迭代该数组。
      【解决方案4】:

      好吧,如果你想无限制地传递一些东西,你可能需要一个变量参数列表。这是一个例子:

        #include <stdio.h>
        #include <stdarg.h>
        int number(int , ... );
      
        int main(void)
        {
             int x =1;
             printf("%d",number(1,x));
        }
        int number(int n, ... )
        {
                va_list         ap;
                va_start(ap,n);
                int x = va_arg(ap,int);
                va_end(ap);
                return x;
        }
      

      或者,如果您只想传递 x 但不使用它。

       #include <stdio.h>
        int number();
      
        int main(void)
        {
            int x =1;
            printf("%d",number(x));
        }
      
        int number()
        {
           int x = 1;
           return x;
        }
      

      它可以编译和工作。当你在 C 中声明 int number (); 时,你的意思是这个函数可以被赋予非特殊类型。但是,你不能使用它。

      【讨论】:

        【解决方案5】:

        好吧,我在找到答案后编辑了整个答案。

        你想要做的是 number(void) 而不是 main(void)。这就是你想要的,它会将任何变量打印为整数。如果您传递 char "F" int number(void) 将返回数字 70,即 "F" 的 int 形式。在代码中:

        int number(void e);
        
        void main(){
            char C = 'F';
            printf("%d",number(C));
        };
        
        int number(void e){
            return e;
        };
        

        注意:

        如果你想要一个超出范围的变量,你必须总是传递一个参数。

        【讨论】:

        • 我了解函数和参数,我的问题是有意处理将数据传递给未指定参数列表的函数。所以不,number() 不应该在这个问题的范围内有一个类型。
        • @worlboss 那我的朋友是不可能的。请记住,计算机是“哑巴”。您创建他将绝对遵循的规则,除非您声明该函数具有参数,否则程序将不会使用它。事实上,通过调用具有先前未声明的参数类型的函数,这将使程序崩溃并且在调试中它不会编译(如果我是正确的),因为计算机不知道“该做什么”(这就是为什么你在这里)。
        • 另外,显式键入 main 是很常见的,可以是 main(void) 或 main(char** argv, int argc)。 main() 的正确性没有减少,但也不再正确了。
        • 哦!等等,我只是仔细阅读了这个问题。你应该做 number(void) 而不是 main(void)。这就是你想要的,它会将任何变量打印为整数。如果传入char "F" int number(void)会返回数字70,即"F"的int形式。
        • (1) 这不编译; void e 不是函数定义中的有效参数声明。 (2) main 应声明为 int main(void)int main(int argc, char *argv[]) 或等效项,而不是 int main()。 (3) “F”不保证为70。
        猜你喜欢
        • 1970-01-01
        • 2019-11-23
        • 1970-01-01
        • 1970-01-01
        • 2014-01-17
        • 2014-02-18
        • 1970-01-01
        • 2019-09-12
        • 2015-01-22
        相关资源
        最近更新 更多