【问题标题】:Does C varargs use a keyword called 'end'?C varargs 是否使用名为“end”的关键字?
【发布时间】:2011-04-21 16:51:50
【问题描述】:

我有很多使用 C 风格变量参数的代码。代码在可变长度函数调用的最后传入一个名为 end 的变量。而且....该代码还有一个名为end 的枚举器。到目前为止,他们还没有发生冲突(编译器错误说它有一个模棱两可的定义:它不会告诉我神秘的第二个“结束”是在哪里定义的),直到我更改为 VC 10.0 编译器(VS 2010)。

那么 end 是某种保留关键字,特别是在变量 args 中使用吗? 我对他们知之甚少。但我查看了大量关于变量参数的文档,以及在此处搜索,但一无所获(这可能是件好事)。所以我猜答案是 end 不是与可变参数一起使用的特殊词。我可以找人确认一下吗?

【问题讨论】:

    标签: c windows winapi variadic-functions


    【解决方案1】:

    不——C 没有将end 定义为对可变参数有任何特殊含义。当您编写一个接受变量参数列表的函数时,由您决定如何告诉它传递了多长时间的列表。一些流行的是第一个参数指定(至少间接地)还有多少参数,并在所有其他参数之后传递一个“哨兵”值(例如,NULL)。举几个例子,printf 是前者,execl 是后者。

    【讨论】:

    • execl,当然。无论如何,这带来了另一个问题 - execl 只能以这种方式工作,因为它的 所有 参数 [包括 NULL] 都是同一类型:char *。这个问题的end 只能在它与他的函数所期望的其他参数的类型相同时才有效。
    • 它不是:我的代码中的“结束”只是在用户定义的长枚举列表的末尾。所以它不是一个字符*。
    【解决方案2】:

    很久以前(例如第 7 版 Unix),定义了三个外部符号:etextedataend。这些对应于代码的高位地址、初始化的数据和堆。可能您对end 的定义不知何故与此冲突。

    【讨论】:

      猜你喜欢
      • 2021-11-28
      • 1970-01-01
      • 2021-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      • 1970-01-01
      • 2014-05-03
      相关资源
      最近更新 更多