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

C++是否存在类似C#中'_'的变量丢弃特性?(Arduino/ESP32场景)

在C++(Arduino/ESP32)中忽略函数返回值的高效方案

针对你遇到的问题——在无法修改原函数的情况下,仅获取所需值并高效忽略其他参数,以下是几种适配Arduino/ESP32内存环境的方案:

一、原函数无法修改时的方案

1. 静态丢弃变量(最优栈空间节省)

声明一个静态float变量作为通用丢弃容器,静态变量仅在程序启动时分配一次内存(位于全局存储区),不会每次调用都占用栈空间,对ESP32这种栈资源紧张的环境更友好:

float temperature;
static float discard; // 仅分配4字节内存,全局复用
readValues(temperature, discard, discard, discard, discard);

注:静态变量会长期占用内存,但单float仅4字节,几乎无影响。

2. 复用单个栈上丢弃变量(简洁直观)

你当前的做法已经足够高效,可将变量名改为下划线(模拟C#丢弃语法,符合C++命名规则),更直观:

float temperature;
float _; // 单栈变量,仅占用4字节栈空间
readValues(temperature, _, _, _, _);

3. const_cast绑定临时对象(无额外变量,但需谨慎)

原函数参数为非const左值引用,无法直接传临时对象,但可通过const_cast绕过(前提是函数内部对这些参数的修改不会引发问题,毕竟你本来就丢弃结果):

float temperature;
readValues(temperature, 
           const_cast<float&>(float{}), 
           const_cast<float&>(float{}), 
           const_cast<float&>(float{}), 
           const_cast<float&>(float{}));

风险:若函数内部对这些临时对象的引用执行了非法操作(比如依赖其后续存在),会导致未定义行为,仅在确认函数逻辑安全时使用。

二、可修改原函数时的规范方案

如果有权修改readValues,推荐改为返回std::tuple,配合现代C++特性实现优雅的丢弃:

#include <tuple>

// 修改后的函数
std::tuple<float, float, float, float, float> readValues() {
    // 执行取值逻辑,计算各变量值
    return {temp_val, hum_val, dew_val, temp_trend_val, hum_trend_val};
}

// 使用方式1:C++17结构化绑定(最直观)
auto [temperature, _, __, ___, ____] = readValues();

// 使用方式2:std::tie + std::ignore(兼容C++11及以上)
float temperature;
std::tie(temperature, std::ignore, std::ignore, std::ignore, std::ignore) = readValues();

这种方式无需额外声明丢弃变量,语法清晰,符合现代C++编程风格。

为什么你的尝试不可行?

  • 传入nullptr:nullptr是指针类型,无法转换为float&,编译报错。
  • 传入0:0是右值字面量,无法绑定到非const左值引用,编译报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 11:30:08