c - 在 C 中无需 stdarg.h 即可访问函数中的未命名参数

标签 c

我总是被告知,当你在函数定义中为参数留下空括号时,该函数可以接受任意数量的参数或未知数量的参数,但我从未见过它被使用。

出于好奇,我想知道是否有一种方法可以访问传递给以这种方式定义的函数的参数。

作为打印参数的函数的示例:

#include <stdio.h>

void emptyParent()
{
    // print arguments
}

int main(void)
{
    emptyParent(1, 2, 3);
    return 0;
}

最佳答案

在函数定义中:

void func() {
    /* ... */
}

空括号表示该函数没有参数。仅仅因为没有参数,就无法访​​问这些参数。

在函数声明中,空括号表示该函数需要未指定但固定数量和类型的参数。在调用中,您必须传递定义指定的正确数量和类型的参数;如果不这样做,就会产生未定义的行为。 (每个参数必须与相应参数的升级类型相匹配。)编译器不会为您强制执行此操作。

在这两种情况下,这是一种旧式语法,不应在新代码中使用。如果函数没有参数,则用 (void) 声明和定义它。如果它有固定数量的参数(一个或多个),则使用指定每个参数类型的原型(prototype)来声明和定义它,以便编译器可以在调用中强制执行正确的参数(并且在某些情况下,可以隐式转换适当类型的参数)。

如果需要可变数量的参数,则需要使用, ...语法和<stdarg.h>访问函数内部参数的机制。这个机制需要一个最终的命名参数来启动;您不能声明或定义类似的函数

void this_is_invalid(...);

可能有一些方法可以在不使用该语言提供的功能的情况下模拟此机制,但没有其他可移植方法可以做到这一点。

关于c - 在 C 中无需 stdarg.h 即可访问函数中的未命名参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29523080/

相关文章:

c - C 实现中的浮点零(IEEE 754 不变量?)

c - Posix 线程参数问题 (C)

c - &ptr.member 和 &(ptr.member) 的区别

c - 而 (isspace(数组))

我可以不在 while 循环中提供相等条件吗?

c++ - 如何判断头文件包含在哪里?

c - 按位运算和填充字节在一起

c - 这是 sleep() 的正确使用吗?

c++ - 为什么这些方法会使我的程序变得如此大?

c++ - 使用 Eclipse 的 RSE 插件更新远程文件