我不知道是否可能,但维基百科文章此处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或维基百科谈论完全不同的东西?
你不能,至少不是标准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++中它是无效的,因为参数的数量不匹配.
这是从旧的 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().