В Visual Studio 2012 я не могу объявить определенные имена как глобальные идентификаторы, потому что они уже объявлены в math.h. Устаревшие проблемы делают неудобным для меня переименование идентификаторов в исходном коде. Какие варианты кроме переименования?
#include "stdafx.h"// iostream includes math.h which declares the following
_CRT_NONSTDC_DEPRECATE(_y1) _CRTIMP double __cdecl y1(_In_ double _X);
int y1; // error - y1 is already declared
void Main()
{
return;
}
Дополнительный вопрос: Visual Studio 2012 обрабатывает это соответствующим образом?
Так как это C ++, вы должны использовать Пространство имен для ваших собственных вещей, особенно если у вас есть глобальные переменные.
#include "stdafx.h"
namespace MyApp
{
int y1; // MyApp::y1
}
Таким образом, вы можете положиться на с помощью ключевое слово, где вам нужно использовать свой y1
переменная без имени пространства имен:
using MyApp::y1; // Now also y1
Идентификатор y1
может появиться в некоторых версиях <math.h>
, но это не определено стандартом C или C ++. Вы должны иметь возможность вызывать компилятор таким образом, чтобы избежать объявления y1
, возможно, отключив языковые расширения. Если компилятор не позволяет вам сделать это, это ошибка в реализации.
y1()
является одной из «функций Бесселя второго рода» (я не совсем уверен, что это значит). Это указано POSIX.
Как я уже говорил в моих комментариях, iostream
не будет в том числе math.h
, скорее cmath
, Тонкая разница в том, что cmath
помещает все в std
Пространство имен. Проблема в том, что вы делаете что-то следующим образом …
using namespace std;
… не. Как видите, вы сами вносите неоднозначность в глобальное пространство имен. Вместо этого попробуйте явно указать, что вам нужно от std
вместо того, чтобы загрязнять глобальное пространство имен чем-либо std
участники были объявлены в ваших включенных заголовках. Вы также должны отказаться от использования глобальных переменных и самого глобального пространства имен.
Как примечание, попробуйте показать весь код, так как было неясно, что _tmain
позвонил Main
Вот.