使用3dCoin开发图形程序引入vector后cmath库报错如何解决
问题根源
这是典型的Windows系统头文件宏与C++标准库命名冲突导致的报错:
- 你引入的Coin3D Windows平台头文件
<Inventor/Win/SoWin.h>内部会引入<Windows.h>,该头文件默认定义了min、max两个全局宏,会对后续代码中所有匹配min、max的标识符做强制文本替换。 - 引入
<vector>时,标准库内部会依赖<cmath>,而<cmath>中定义了std::min、std::max模板函数,这些函数名会被前面的Windows宏直接替换,导致标准库代码语法解析失败,所以你会看到cmath标准库文件抛出语法错误,并非你修改了标准库文件。
修复方案
任选以下任意一种方案即可解决:
- 方案1(最推荐):在所有引入Windows相关头文件的位置之前,添加
NOMINMAX宏定义,禁止Windows.h生成min/max宏。代码调整如下:
#define NOMINMAX // 必须放在所有Coin3D头文件的最前面,否则不生效 #include <Inventor/Win/SoWin.h> #include <Inventor/Win/viewers/SoWinExaminerViewer.h> #include <Inventor/nodes/SoSeparator.h> #include <vector> int main(int, char ** argv) { HWND window = SoWin::init("0.off"); if (window == NULL) exit(1); SoSeparator * root = new SoSeparator; root->ref(); SoWinExaminerViewer *viewer = new SoWinExaminerViewer(window); viewer->setSize(SbVec2s(640, 480)); viewer->setSceneGraph(root); viewer->show(); SoWin::show(window); SoWin::mainLoop(); delete viewer; root->unref(); return 0; }
- 方案2(兼容场景):如果你的业务代码必须保留Windows的min/max宏,调用标准库min/max函数时用括号包裹函数名,即可避免被宏替换,示例:
int res = (std::min)(1, 3);。
内容的提问来源于stack exchange,提问作者nazer3
相关产品推荐
相关产品推荐

