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