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

时间:2018-05-11 23:09:43

标签: c++ visual-c++

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

"C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Auxiliary\Build\vcvars64.bat"
cl test.cpp

我得到以下结果:

C:\temp\tests>"C:\Program Files (x86)\Microsoft Visual 
Studio\2017\Enterprise\VC\Auxiliary\Build\vcvars64.bat"
**********************************************************************
** Visual Studio 2017 Developer Command Prompt v15.4.5
** Copyright (c) 2017 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64'

C:\temp\tests>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 
Kits\10\include\10.0.16299.0\ucrt\corecrt_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;
}

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

1 个答案:

答案 0 :(得分:2)

这个构建命令对我有用:

cl foo.cpp /Feb /D _CRT_DECLARE_NONSTDC_NAMES=0