我刚刚遇到某人的C代码,我很困惑为什么要编译.有两点我不明白.
首先,与实际函数定义相比,函数原型没有参数.其次,函数定义中的参数没有类型.
#include <stdio.h>
int func();
int func(param)
{
return param;
}
int main()
{
int bla = func(10);
printf("%d", bla);
}
Run Code Online (Sandbox Code Playgroud)
为什么这样做?我已经在几个编译器中测试过,它运行正常.
有人可以向我解释为什么以下代码在没有警告或错误的情况下编译?
我希望编译器警告我函数测试不要求任何参数.
但代码递归编译并运行函数测试.
static void has_args(int a, int b, int c) {
printf("has_args\n");
}
static void no_args() {
printf("no_args\n");
no_args(1, 2, 3);
}
void main() {
no_args();
}
Run Code Online (Sandbox Code Playgroud) 我一直在阅读的区别function()及function(void)使用C,我才知道,
函数声明中的空参数列表表示该函数采用未指定数量的参数
所以我运行了这段代码:
#include <stdio.h>
void fun();
int main(void)
{
fun(12, 13.22, 1234567890987654321, "wow", 'c');
}
void fun()
{
printf("What happened to those arguments?");
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么 C 允许这样做。到目前为止,我读过的所有与此相关的帖子都说使用它是不好的做法,它已经过时等。此外,从上面的代码中,我认为这些参数的类型也未指定。所以我只想知道“未指定类型的未指定参数”背后的原因:
可以用这些参数做什么?
是否可以在函数中访问这些参数?
例如,
#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()吗?如果是这样,这是怎么做到的?如果没有,传递的参数会有什么不同吗?那是我的问题.
c parameters declaration command-line-arguments function-declaration
从功能和语法上来说,原型为int foo(void)和的函数之间是否有区别int foo(void *)?
我知道,例如之间的差异,int bar(int)以及int bar(int *)-其中之一是寻找一个int,另一种是找一个int指针。void行为是否相同?