捕获变量传递给没有参数的函数

Kar*_*and 5 c

我不知道是否可能,但维基百科文章此处C和C++的兼容性说明如下:

在C中,没有参数的函数原型,例如int foo();,意味着参数未指定.因此,用一个或多个参数调用这样的函数是合法的,例如foo(42, "hello world").

相比之下,在C++中,没有参数的函数原型意味着函数不带参数,并且使用参数调用这样的函数是不正确的.

在C中,声明不带参数的函数的正确方法是使用void,如 int foo(void);.

我做了以下代码来测试它并捕获传递的变量(这不能正常工作)

#include<stdio.h>
#include<stdarg.h>

void foo();

int main()
{
    int i = 3;
    foo(i);
    return 0;
}

void foo()
{
//    va_list args;
//    va_start(args);
//
//    int x = va_arg (args, int);
//    printf("%d", x);
//    va_end(args);
}
Run Code Online (Sandbox Code Playgroud)

是否有可能抓住传递i或维基百科谈论完全不同的东西?

Yu *_*Hao 5

你不能,至少不是标准C.维基百科文章的意思是这段代码:

void foo();

int main()
{
    int i = 3;
    foo(i);
    return 0;
}

void foo(int i)
{
    (void)i;
}
Run Code Online (Sandbox Code Playgroud)

在C中编译很好,但在C++中它是无效的,因为参数的数量不匹配.


rod*_*igo 2

这是从旧的 C 时代开始的,当时语言的严格性是,嗯……,放松的。

基本思想是,如果翻译单元中有一个函数,请说foo.c

float foo(int x) 
{
     return 2.0F * x;
}
Run Code Online (Sandbox Code Playgroud)

然后你想在另一个翻译单元中使用它,比如说,main.c但你不想编写头文件,你可以这样做:

int main()
{
    float foo();
    float r;
    r = foo(42);
}
Run Code Online (Sandbox Code Playgroud)

而且您不必编写函数的参数。公平地说,您根本不必编写原型,但编译器会假设该函数总是返回int,这可能不是您需要的。

然后,随着语言的成熟,这种函数声明被认为是一个非常糟糕的主意,所以一般来说你不应该(尝试)使用它。如果您想要一个可变参数函数,那么一定要使用它,但要这样声明。并且您必须至少给它一个真正的参数,以将调用锚定到va_start().