5

我不知道这是否可能,但这里的维基百科文章Compatibility of C and 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);
}

是否有可能赶上过去i或维基百科正在谈论完全不同的东西?

4

5 回答 5

5

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

void foo();

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

void foo(int i)
{
    (void)i;
}

在 C 中编译良好,但在 C++ 中无效,因为参数的数量不匹配。

于 2013-10-30T08:58:29.393 回答
4

如果您阅读文档,va_start您会发现它需要参数列表中的最后一个“真实”参数。因此,如果您不声明任何参数,则在纯 C 中不可能获取参数。

可以做的是声明没有参数的函数原型,并在实际定义中具有参数。

于 2013-10-30T08:55:36.700 回答
2

这来自旧的 C 时代,当时语言的严格性是,嗯...,放松的。

基本思想是,如果您在翻译单元中有一个功能,请说foo.c

float foo(int x) 
{
     return 2.0F * x;
}

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

int main()
{
    float foo();
    float r;
    r = foo(42);
}

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

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

于 2013-10-30T09:05:00.447 回答
0

您可以使用任何参数调用该函数,但不能在函数范围内访问它们。无论如何,如果你不声明原型,一些编译器会给你警告,int foo (void);因为你可能不想这样做。

于 2013-10-30T08:58:27.447 回答
0

有一种方法可以在 C 程序中访问这些参数,但我认为它是一个大黑客,应该避免。

下一个示例显示如何访问 int 参数:

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

void foo();

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

void foo(int p)
{
    printf("%d",p);
}

现在,我不确定如果您传递其他内容然后是 int(例如 char*)会发生什么,但它可能会导致未定义的行为。

在 c++ 中(如前所述),您不能将参数传递给不带参数的函数。

于 2013-10-30T09:07:44.790 回答