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

树莓派Zero中如何更新__cplusplus宏的值?

解决G编译时__cplusplus宏不匹配C17版本的问题

问题背景

  • 环境:树莓派Zero,G++版本为g++ (Raspbian 10.2.1-6+rpi1) 10.2.1 20210110
  • 现象:Makefile中已指定CXXFLAGS := -std=c++17 -Wall,单独执行g++ -x c++ -std=c++17 -dM -E - </dev/null时__cplusplus值为201703L(正确对应C17),但编译项目时该宏值仍为201402L(C14),导致依赖#if __cplusplus >= 201703L的头文件无法正常启用C++17特性。
  • 编译命令输出:g++ -std=c++17 -Wall -O3 -pthread -o main <所有cpp文件> -lpigpio -lrt

解决方案

1. 切换到GNU扩展的C++17标准

将Makefile中的-std=c++17替换为-std=gnu++17:

SOURCES := $(shell find ./src -name '*.cpp')
CXXFLAGS := -std=gnu++17 -Wall

default: 
    $(CXX) $(CXXFLAGS) -O3 -pthread -o main $(SOURCES) -lpigpio -lrt

.PHONY: clean
clean:
    rm main

GCC的-std=c++17是严格标准模式,部分场景下会保留旧的__cplusplus值以兼容遗留代码;而-std=gnu++17包含GNU扩展,会正确更新__cplusplus宏到对应标准版本。

2. 显式强制定义__cplusplus宏

如果第一种方法无效,直接在编译选项中指定宏值:

CXXFLAGS := -std=c++17 -D__cplusplus=201703L -Wall

此方式会绕过编译器的默认兼容逻辑,强制将__cplusplus设置为C++17对应的201703L。

3. 排查潜在干扰因素

  • 检查参数顺序:确保-std=c++17/-std=gnu++17出现在所有源文件和其他编译选项之前(你的当前编译命令顺序是正确的)。
  • 检查头文件宏重定义:排查项目及依赖库的头文件,确认是否存在#define __cplusplus 201402L这类强制修改宏值的语句,若有则移除或修改该定义。

验证方法

在项目任意源文件中添加以下代码,编译运行后查看输出:

#include <iostream>
int main() {
    std::cout << "__cplusplus value: " << __cplusplus << std::endl;
    return 0;
}

若输出为201703L,则说明设置生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 20:50:26