Как бороться с загрязнением math.h в Visual Studio C ++?

В 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 обрабатывает это соответствующим образом?

1

Решение

Так как это C ++, вы должны использовать Пространство имен для ваших собственных вещей, особенно если у вас есть глобальные переменные.

#include "stdafx.h"
namespace MyApp
{
int y1; // MyApp::y1
}

Таким образом, вы можете положиться на с помощью ключевое слово, где вам нужно использовать свой y1 переменная без имени пространства имен:

using MyApp::y1; // Now also y1
2

Другие решения

Идентификатор y1 может появиться в некоторых версиях <math.h>, но это не определено стандартом C или C ++. Вы должны иметь возможность вызывать компилятор таким образом, чтобы избежать объявления y1, возможно, отключив языковые расширения. Если компилятор не позволяет вам сделать это, это ошибка в реализации.

y1() является одной из «функций Бесселя второго рода» (я не совсем уверен, что это значит). Это указано POSIX.

0

Как я уже говорил в моих комментариях, iostream не будет в том числе math.h, скорее cmath, Тонкая разница в том, что cmath помещает все в std Пространство имен. Проблема в том, что вы делаете что-то следующим образом …

using namespace std;

не. Как видите, вы сами вносите неоднозначность в глобальное пространство имен. Вместо этого попробуйте явно указать, что вам нужно от stdвместо того, чтобы загрязнять глобальное пространство имен чем-либо std участники были объявлены в ваших включенных заголовках. Вы также должны отказаться от использования глобальных переменных и самого глобального пространства имен.

Как примечание, попробуйте показать весь код, так как было неясно, что _tmain позвонил Main Вот.

0
По вопросам рекламы [email protected]