相关疑难解决方法(0)

为什么没有参数的函数(与实际函数定义相比)编译?

我刚刚遇到某人的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)

为什么这样做?我已经在几个编译器中测试过,它运行正常.

c parameters function-parameter function-prototypes

385
推荐指数
8
解决办法
5万
查看次数

C函数没有参数行为

有人可以向我解释为什么以下代码在没有警告或错误的情况下编译?

我希望编译器警告我函数测试不要求任何参数.

但代码递归编译并运行函数测试.

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)

c

31
推荐指数
2
解决办法
3万
查看次数

function() 中未指定的参数会发生什么?

我一直在阅读的区别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 允许这样做。到目前为止,我读过的所有与此相关的帖子都说使用它是不好的做法,它已经过时等。此外,从上面的代码中,我认为这些参数的类型也未指定。所以我只想知道“未指定类型的未指定参数”背后的原因:

  • 可以用这些参数做什么?

  • 是否可以在函数中访问这些参数?

c function

11
推荐指数
2
解决办法
608
查看次数

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

例如,

#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

10
推荐指数
1
解决办法
188
查看次数

foo(void)与foo(void *)

从功能和语法上来说,原型为int foo(void)和的函数之间是否有区别int foo(void *)

我知道,例如之间的差异,int bar(int)以及int bar(int *)-其中之一是寻找一个int,另一种是找一个int指针。void行为是否相同?

c c++ function-prototypes

9
推荐指数
2
解决办法
170
查看次数