树莓派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
相关产品推荐
相关产品推荐

