Как бороться с загрязнением 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 обрабатывает это соответствующим образом?

3 ответа

Решение

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

#include "stdafx.h"

namespace MyApp
{
    int y1; // MyApp::y1
}

Таким образом, вы можете положиться на ключевое слово using, где вам нужно использовать 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 Вот.

Другие вопросы по тегам