在 C 函数中,我想检查是否存在输入参数(在我的例子中为“值”)。
即:
void Console(char string[], int32_t value)
{
// write string here
// write value here, if it exists
}
当使用 if(value != NULL)
语句时,我的 Console() 函数发送 4096
我如何检查并根据参数的存在采取行动?
最佳答案
C 中通常不允许使用可选参数(但它们存在于 C++ 和 Ocaml 等中)。唯一的异常(exception)是 variadic functions (如 printf
)。
历史上,open(2)来自 POSIX 的函数在某些情况下接受可选的第三个参数(在它被定义时 - 在 1970 年代和 1980 年代 -,calling conventions 实际上将参数压入调用堆栈,因此忽略该参数很容易实现)。如果您今天查看该 open
的最近实现情况在 Linux 上的自由软件 libc 实现中的功能,例如 musl-libc ,你在它的 src/fcntl/open.c 中看到它使用 <stdarg.h>
variadic facilities (作为编译器内置函数是 often implemented)。
顺便说一句,你可以定义一些宏来填充“缺失的”参数,所以如果你有
void console(const char*, int32_t);
你也可以
#define console_plain(Msg) console((Msg),0)
这可能是某些 header 中的一些内联函数,例如
static void inline console_plain (const char*msg)
{ console(msg, 0); }
然后使用 console_plain("hello here")
别处
然后你的可变参数函数应该定义如何以及允许什么参数(在 fixed 参数的非空序列之后)。并使用 stdarg(3)获取这些可变(实际)参数。
实际参数主要在编译时已知,而不是在运行时。所以你需要一个约定,它通常定义从所需的固定参数中允许哪些可变参数。特别是,您无法测试参数是否存在(该信息在运行时丢失)。
顺便说一句,对于可变参数函数,您通常会失去大多数 C 编译器提供的类型检查(至少当您启用所有警告时,例如 gcc -Wall -Wextra
)。如果使用 GCC
你可能有一些 function __attribute__
-s (如 format
, sentinel
,....)在原型(prototype)中协助。您甚至可以自定义 gcc
与过时的MELT ,或在 2019 年与您的 GCC plugin , 添加您自己的属性进行自己的类型检查。
How can I check and act based on argument existence?
根据当前常用的调用约定(例如研究 x86-64 ABI ),您通常不能这样做(不使用可变参数函数)。
关于c - C 函数中的可选参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27795767/