我可以声明没有参数的函数,然后用参数定义它吗?

Can I declare function without parameters and later define it with parameters?

提问人:Coderey123 提问时间:1/24/2023 最后编辑:Jonathan LefflerCoderey123 更新时间:1/24/2023 访问量:75

问:

我可以声明一个没有参数的函数,然后用参数定义它吗?

我试图定义一个内部没有参数的函数,然后用参数声明它?我可以用 C 语言做吗?

#include<stdio.h>
void change_order(); //Here Here
int main()
{
    int num[3];
    for(int i = 0; i<3; i++)
    {
        printf("Enter Number%i:", i+1);
        scanf("%i", &num[i]);
    }
    change_order(num, 0, 1);
     for(int i = 0; i<3; i++)
     {
         printf("%i\n", num[i]);
     }
}

void change_order(int array[], int index1, int index2 )
{
    if(array[index1]>array[index2])
    {
      int Temp = array[index1];
      array[index1] = array[index2];
      array[index2] = Temp;
    }
}

还有一个问题: 我可以写吗?void change_order(int array[int n])

C 参数 参数传递 custom-function

评论

3赞 John3136 1/24/2023
没有理由这样做。也许你的问题应该是你为什么要这样做?
2赞 Gene 1/24/2023
C 允许它与非常旧的代码兼容。旧方式被抛弃的原因很好。实际上,一个函数只能有一个实际签名。在调用该签名或函数本身之前,您应该始终拥有该签名或函数本身的完整原型。

答:

1赞 dbush 1/24/2023 #1

本声明:

void change_order();

声明该函数接受未知数量的参数并返回 。函数的定义与此匹配。change_ordervoid

但是,还有一个额外的要求。由于调用方不知道参数的数量或类型,因此实际参数不能具有需要升级的类型。这意味着将提升为 或 的 type 和 (either or ) 参数以及将提升为 的 type 参数将不被允许。charshortsignedunsignedintunsigned intfloatdouble

的定义不使用其类型将受到升级的任何参数,因此声明是有效的。change_order

在声明中使用空参数列表被认为是过时的功能,因为它会阻止参数的编译类型检查,应避免使用声明其参数类型的声明。

1赞 Jonathan Leffler 1/24/2023 #2

直到并包括 C17 (C18),您可以逃脱惩罚。

从 C23 开始,当它发布时,这将是不允许的。

在旧版本的标准中,声明 of 表示函数存在并返回(无),但对其参数的数量或类型一无所知,只是它不是可调参数函数(类似于 — 其原型不以 结尾)。它不提供函数的原型,只是一个声明。void change_order();voidprintf(), ...

在 C23 中,该声明将与 — 一个不带参数且不返回值的函数相同。然后,带有参数的定义将与声明冲突并被拒绝,带有参数的调用也将被拒绝。void change_order(void);

不要使用过时的符号 - 它的有用寿命充其量以月为单位。

你还问你是否可以写.void change_order(int array[int n])

答案是否定的。如果定义得当,也许可以写。但是,使用可变长度数组编写函数的正常方法是 ,或用于首选项。void change_order(int array[n]);nvoid change_order(int n, int array[n])size_t n