标准库标识符与用户标识符冲突

Standard library identifiers conflict with user identifiers

本文关键字:标识符 用户标识 冲突 用户 标准      更新时间:2023-10-16

我正在尝试在 64 位 Win10 系统上使用 VS2017 从命令行编译/链接名为 test.cpp 的文件。 我使用这两个命令:

"C:Program Files (x86)Microsoft Visual Studio2017EnterpriseVCAuxiliaryBuildvcvars64.bat"
cl test.cpp

我得到以下结果:

C:temptests>"C:Program Files (x86)Microsoft Visual 
Studio2017EnterpriseVCAuxiliaryBuildvcvars64.bat"
**********************************************************************
** Visual Studio 2017 Developer Command Prompt v15.4.5
** Copyright (c) 2017 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64'
C:temptests>cl test.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 19.11.25547 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.
test.cpp
test.cpp(2): error C2365: 'y1': redefinition; previous definition was 'function'
C:Program Files (x86)Windows 
Kits10include10.0.16299.0ucrtcorecrt_math.h(984): note: see declaration of 'y1'
test.cpp(5): error C2659: '=': function as left operand

我的文件包含以下代码:

#include <new>
static int *y1;
int main()
{
y1 = new (std::nothrow) int;
}

虽然我理解为什么会发生这种情况以及可以修复它的任意数量的 kluge,但在我看来,实际缺陷在 Microsoft corecrt_math.h 头文件中。 当我看到那里时,我看到了更多的标识符(j0,jn,jn等(,这些标识符可以很容易地被毫无戒心的程序员合法选择,但最终会遇到同样的问题。 我的印象是,有一个"君子协议",即在库代码中暴露未记录的标识符将以下限开始或结束,而用户代码不会,只是为了避免这种类型的问题。

这个构建命令对我有用:

cl foo.cpp/Feb/D _CRT_DECLARE_NONSTDC_NAMES=0