c - C 函数中的可选参数

标签 c function arguments

在 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 (如 formatsentinel ,....)在原型(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/

相关文章:

android - 内核到用户空间应用程序通信

function - 定义具有属性 f(a,b,c) = f(c,a,b) = f(b,c,a) 的函数

r - 为长度为 k 的向量找到 n 个可能值的所有非等价排列

javascript - 为什么有时在使用变量之前将 'null' 分配给它

c - 如何计算 C 中的 argc

c - 用于多个子部分加法的流程 API

c - libX11 : XPutImage first call

c - 为什么将 4 字节参数传递给需要 2 字节参数的函数有效?

java - 运算符对于类类型无效

C函数变量改变