如果我用一个空参数表声明一个函数,然后传递参数怎么办?

nal*_*zok 10 c parameters declaration command-line-arguments function-declaration

例如,

#include <stdio.h>

void foo();

int main(void)
{
        foo();
        foo(42);
        foo("a string", 'C', 1.0);
        return 0;
}

void foo()
{
        puts("foo() is called");
}
Run Code Online (Sandbox Code Playgroud)

输出:

foo() is called
foo() is called
foo() is called
Run Code Online (Sandbox Code Playgroud)

这段代码编译得很好(没有使用clang的警告)并运行良好.但我想知道传递给的值会发生什么foo()?他们被推入堆栈还是被丢弃?

也许这个问题听起来毫无用处,但它确实有意义.例如,当我有int main(),而不是int main(void)传递一些命令行参数时,行为main()会受到影响吗?

此外,在使用时<stdarg.h>,...ISO C 之前至少需要一个命名参数.我们是否可以使用这样的声明void foo()从函数的零参数传递到无限参数?

我注意到这void foo()是一个"非原型声明",这void foo(void)是一个"原型宣言".这有点相关吗?


澄清

似乎这个问题被标记为重复,空参数列表是什么意思?[重复](有趣的是,这个问题也是重复的......).事实上,我不认为我的问题与那个问题有关.它侧重于" void foo()C中的含义",但我知道这意味着"我可以传递任意数量的论据",而且我也知道这是一个过时的功能.

但这个问题完全不同.关键字是"假设".我只是想知道我是否传递了不同数量的参数void foo(),就像上面的示例代码一样,它们可以在里面使用foo()吗?如果是这样,这是怎么做到的?如果没有,传递的参数会有什么不同吗?那是我的问题.

zan*_*ngw 2

在 C 中,void foo()声明一个带有未指定数量的参数的函数。函数按以下方式声明:

return-type function-name(parameter-list,...) { body... }
Run Code Online (Sandbox Code Playgroud)

parameter-list是函数采用逗号分隔的参数列表。如果没有给出参数,则该函数不接受任何参数,并且应该使用一组空括号或关键字 void 进行定义。如果参数列表中变量前面没有变量类型,则假定为 int。