Cmath.h и ошибки компиляции
Я работал с math.h без проблем. Теперь я использую внешнюю библиотеку, которая сама имеет файл с именем math.h
, но который включает < cmath>
.
Добавление этой библиотеки в мой проект (или даже просто добавление каталога include, не касаясь кода) теперь генерирует множество ошибок из < cmath>
:
C:\Program Files\Microsoft Visual Studio 8\VC\include\cmath (18): ошибка C2039: "acosf": не является членом "глобального пространства имен"
C:\Program Files\Microsoft Visual Studio 8\VC\include\cmath (18): ошибка C2873: символ "acosf": не может использоваться в декларации использования
C:\Program Files\Microsoft Visual Studio 8\VC\include\cmath (18): ошибка C2039: 'asinf': не является членом `` global namespace ''
C:\Program Files\Microsoft Visual Studio 8\VC\include\cmath (18): ошибка C2873: символ 'asinf': не может использоваться в декларации using
[etc, etc...]
Я не понимаю, почему это происходит. Я использую Visual Studio 2005 и смотрю в Интернете, кажется, что эта проблема решена в VS 2008. Однако я бы хотел остаться на VS 2005...
Включение using namespace std;
повсюду или изменение порядка моих включений, похоже, ничего не меняет. Определение _STD_BEGIN
решает ошибку, но производит столько же в < xlocinfo>
.
Как это можно решить?
Ответы
Ответ 1
Я не уверен, что правильно прочитал ваш вопрос, но кажется странным, что библиотека отправит собственный файл math.h.
Возможно, вы предположили бы поставить родительский каталог в свой путь включения, чтобы <my_lib/math.h>
мог быть включен без конфликта с вашим компилятором <math.h>
?
Ответ 2
Такая же проблема существует в VC 10. Я думаю, что <cmath>
включает сам math.h
, но insted из правильного, который поставляется с VC, он использует тот, который создается в User-Project (с разными содержание курса).
Решение: никогда не используйте файл с именем math.h
в вашем проекте... (или исправьте std где-нибудь).
Ответ 3
Проблема, вероятно, заключается в смешивании библиотек 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, а не файл *.cpp.
Я уверен, что другое подобное смешение C и С++ может привести к аналогичным проблемам.
Ответ 4
(1) Согласно Microsoft, C2873 означает:
'symbol': символ не может использоваться в декларации использования
В директиве using отсутствует ключевое слово namespace. Это приводит к тому, что компилятор неправильно интерпретирует код как декларацию использования, а не директиву using.
(2) Также, когда у меня был C2873 с C2039 (я пытался объединить CEF3 и Cinder), я как-то обошел обе ошибки, изменив Properties- > Configuration Properties- > C/С++ → Code Generation;
Включить минимальную перестройку: Да (/Gm), Включить исключение С++: Да (/EHsc), Включить привязку уровня функции: пусто