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), включить связывание на уровне функций: пусто