You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++ ellipsis可变参数函数调用时是否支持传入变量作为实参?

结论

调用C风格可变参数(ellipsis)函数时,不需要必须传入固定字面值,传入变量作为实参是完全合法的写法,你需要注意的只是参数类型是否符合可变参数的传递要求。

详细说明

  • 可变参数列表的实参传递规则和普通函数参数没有本质区别:不管是字面值还是变量,只要是符合传递要求的类型,都可以正常传入。你示例中的int a、double b两个变量直接传入func是完全没问题的,效果和传对应类型的字面值完全一致。
  • 你给出的示例存在一个潜在问题:将std::string类型的变量传入C风格可变参数函数属于未定义行为。这是因为C风格可变参数只能传递*可平凡复制(Trivially Copyable)*的类型,std::string不属于这类类型,不管你传的是std::string变量还是临时对象,都会触发问题,这个问题和实参是变量还是字面值无关。
  • 合法的变量传参示例:
int a = 5;
double b = 2.7;
const char* c = "Hi";

// 两种调用写法完全等价,都是合法的
func(3, a, b, c);
func(3, 5, 2.7, "Hi");
  • 额外注意:你在可变参数函数内部通过va_arg解析参数时,必须准确匹配每个传入参数的类型,否则无论你传的是变量还是字面值,都会触发未定义行为。

内容的提问来源于stack exchange,提问作者Pratap Biswakarma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 07:09:02