Стандартные библиотечные идентификаторы конфликтуют с пользовательскими идентификаторами - PullRequest
0 голосов
/ 12 мая 2018

Я пытаюсь скомпилировать / связать мой файл с именем test.cpp из командной строки, используя VS2017 в 64-битной системе Win10.Я использую эти две команды:

"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;
}

Пока я понимаюпочему это происходит, и любое количество клугов, которые это исправят, мне кажется, что фактический дефект находится в заголовочном файле Microsoft corecrt_math.h.Когда я смотрю туда, я вижу еще несколько идентификаторов (j0, jn, jn и т. Д.), Которые так же легко могут быть легитимно выбраны ничего не подозревающим программистом только для того, чтобы в конечном итоге столкнуться с той же проблемой.У меня сложилось впечатление, что было «джентльменское соглашение», которое раскрывало недокументированные идентификаторы в библиотечном коде, начиналось или заканчивалось подчеркиванием, а пользовательский код - нет, просто чтобы избежать подобных проблем.

1 Ответ

0 голосов
/ 12 мая 2018

Эта команда сборки работает для меня:

cl foo.cpp /Feb /D _CRT_DECLARE_NONSTDC_NAMES=0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...