c - 使用 NULL 强制结束可变函数参数

标签 c exec variadic-functions unistd.h

是否可以声明可变函数,使其不以“...”结尾?

今天我从 unistd.h 中学到了更多关于 exec 的知识,但这一天我看到了三个(实际上是两个)不同的 execl 声明:

1) int execl ( const char * path, const char * arg0, ..., (char*)NULL ); 在学校给我们看了,我想我必须结束带有 NULL 值的函数调用

2) int execl(const char *path, const char *arg, .../* (char *) NULL */); 是我在 exec(3 ) 手册页。这可能意味着我仍然必须以 NULL 值结束它,但它不是强制执行的。

3) int execl(const char *path, const char *arg, ...); 是我找到的here .这一个通常会让我休息,第一个是对学生的简化,第二个是一个 varning,这是真实的(尽管我通常可能更看重选项一和选项二。)

但后来我在同一网站上发现了这个声明:

int execle(const char *path, const char *arg, ..., char * const envp[]);

同样的问题适用,我无法创建不以 ... 结尾的可变参数函数,gcc 告诉我它期望 ')' before ',' token 指向到三个点后的逗号。

最后,是否有可能使可变参数函数以 NULL 字符 (execl) 结尾,如果不能,是否有可能使其以预定义变量 (execle) 结尾?

我尝试用 gcc 6.3.1 编译,我也试过 --std=c11。

最佳答案

Is it possible to make declaration of variadic function so that it doesn't end with "..."?

Is it possible 是一个狡猾的问题,但请考虑以下事实:

  • 标准规定“如果定义接受可变数量参数的函数时没有以省略号结尾的参数类型列表,则行为未定义”(C2011,6.9.1/8)

也许这已经回答了这个问题,但如果您选择含糊其词并专注于不是定义的函数声明,那么

  • 函数定义也是声明
  • C 语言标准要求同一函数的所有声明都“兼容”(否则程序行为未定义)(C2011 6.7/4)
  • 参数列表不匹配的两个函数声明不兼容(C2011,6.2.7/3)

因此,如果您声明了一个实际上也已定义的可变参数函数,并且该函数的参数列表不结束 ...,那么程序的行为是未定义。


您一直在阅读的有关 execle()execl() 的文档是为了表达和讨论这些函数的期望而编写的,但就其看起来而言呈现参数列表的最后一个元素不是 ... 的可变参数函数声明,这些实际上不是有效的 C 函数声明。

So finally, is it possible to make variadic functions ending with a NULL characters (execl) and if not, is it possible to make it end with predefined variable (execle)?

不可能通过一致的 C 声明来描述这样的调用约定。可变参数函数可以有这样的期望,并且可以在运行时强制执行它们,但它们只能在编译时由依赖于所涉及函数的特殊知识的编译器或允许描述此类约束的 C 语言扩展来强制执行。

关于c - 使用 NULL 强制结束可变函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42984291/

相关文章:

c++ - MySQL 和可变参数

go - 如何在 Go 中将可变参数从一个函数传递到另一个函数

C90 : How do I globally initialize this struct in C without C99 extensions

c - 关于C指针的疑惑

c - 地址不会增加以打印字符

c - 我正在尝试用 c 计算指数,但这就是得到的

Go:运行外部 Python 脚本

c++ - execlp 的多行输出

windows - Ant exec - 无法运行程序 'start' CreateProcess 错误 = 2

c - 将 uint64_t 错误地传递给 va_list