cmath.h и ошибки компиляции

Я работал с математикой.H без каких либо проблем. Теперь я использую внешнюю библиотеку, которая сама имеет файл с именем math.h, но который включает в себя < cmath>.

добавление этой библиотеки в мой проект (или даже просто добавление каталога include, не касаясь кода) теперь генерирует тонны ошибок из < cmath> :

C:Program FilesMicrosoft Visual Studio 8VCincludecmath (18): ошибка C2039: 'acosf': не является членом "глобального пространства имен"

C:Program FilesMicrosoft Visual Studio 8VCincludecmath (18): ошибка C2873: 'acosf': символ не может использоваться в объявлении using

C:Program FilesMicrosoft Visual Studio 8VCincludecmath (18): ошибка C2039: 'asinf': не является членом "глобального пространства имен"

C:Program FilesMicrosoft Visual Studio 8VCincludecmath (18): ошибка C2873: "asinf": символ не может использоваться в объявлении using

[etc, так далее...]

Я не понимаю, почему это происходит. Я использую Visual Studio 2005 и смотрю в интернете, кажется, что эта проблема решена под VS 2008. Тем не менее, я хотел бы остаться на VS 2005...

в том числе using namespace std; везде, или изменение порядка моих включений, похоже, ничего не меняет. Определение _STD_BEGIN решает ошибку, но производит столько же в < xlocinfo>.

как это можно решить?

4 ответов


Я не уверен, что правильно прочитал Ваш вопрос, но кажется странным, что библиотека отправит свою собственную математику.H-файл.

возможно, вы должны поместить родительский каталог в свой путь включения, чтобы <my_lib/math.h> может быть включен без конфликта с вашим компилятором <math.h>?


такая же проблема существует в VC 10. Я думаю, что <cmath> включает в себя math.h но вместо правильного, который поставляется с VC, он использует тот, который создан в пользовательском проекте (с различным содержанием, конечно).

решение: никогда не используйте файл с именем math.h в вашем проекте... (Или исправьте std где-нибудь).


проблема, вероятно, в смешивании библиотек C с соглашениями c++. Например:

#include <math.h>
namespace TEST {
}

это прекрасно компилируется, тогда как:

namespace TEST {
  #include <math.h>
}

это создает большое количество ложных ошибок.

просто чтобы запутать вопрос:

#include <math.h>
namespace TEST {
  #include <math.h>
}

Это также компилируется, поскольку он может быть включен только один раз (в первый раз).

следовательно:

#include <math.h>
namespace TEST {
  #include "SomethingThatIncludesMath.h"
}

будет работать, тогда как:

namespace TEST {
  #include "SomethingThatIncludesMath.h"
}

не будет.

вы можете также получите аналогичные проблемы, включив заголовки C++ в A *.файл c, а не a *.файл cpp.

Я уверен, что другое подобное смешивание C и C++ может привести к аналогичным проблемам.


(1) согласно Microsoft, c2873 означает;

'symbol': символ не может использоваться в объявлении using В директиве using отсутствует ключевое слово namespace. Это заставляет компилятор неправильно интерпретировать код как объявление using, а не директиву using.

(2) также, когда у меня был C2873 с C2039 (я пытался объединить CEF3 и Cinder), каким-то образом я обошел обе ошибки, изменив свойства - >свойства конфигурации - >C / C++ - >код Поколение;

включить минимальное перестроение: да (/Gm), включить исключение C++: да(/EHsc), включить связывание на уровне функций: пусто