假设我有一个可变参数函数foo(int tmp, ...)
,当调用 foo 函数时,我需要知道有多少个参数。我知道有两种方法可以找出有多少参数:
调用 foo 时使用最后一个参数,例如 -1,因此您的函数调用将是这样的:
foo(tmp, 1, 2, 9, -1)
当您在 foo 内部并且 va_arg 调用返回 -1 时,您知道您已经阅读了所有函数参数在 foo 中再添加一个参数,程序员将拥有参数总数,因此您将像这样调用 foo:
foo(tmp, 5, 1, 2, 3, 4, 5)
或foo(tmp, 2, 7, 8)
我曾经遵循第一种方式,曾经有以下错误。使用代码:
expr_of_type(expr, boolexpr_e, newtable_e, nil_e, -1)
其中 expr_of_type 是一个可变参数函数,并且正在检查 expr(第一个参数)是否是以下类型之一(boolexpr_e 或 new_table_e 或 nil_e 具有枚举类型的所有类型)。一不小心写到:
expr_of_type(expr, boolexpr_e, newtable_e, nil_e -1)
我忘记了 nil_e 和 -1 之间的逗号,因为 nil_e 有一个枚举类型,nil_e - 1 是一个有效的表达式,并且因为 nil_e 不是 0 尝试获取 expr_of_type 参数时给定的可变参数函数没有找到 -1 作为最后一个参数和继续搜索创建了一个错误,我花了一些时间才发现。
我也觉得第二种方法不好,因为在从可变参数函数中添加或删除一个参数时,您需要更改包含总参数数量的参数。
在寻找使用/创建可变参数函数的更好方法时,我发现可变参数宏可以解决我在使用第一种方法时遇到的错误。但可变参数宏可用于 C99 标准。我一直在寻找在 C89 中使用/创建可变参数函数的更好方法。有任何想法吗?