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

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

11 голосов
/ 21 октября 2010

Раньше я работал с 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»: не является членом «глобального пространства имен»

C: \ Program Files \ Microsoft Visual Studio 8 \ VC \ include \ cmath (18): ошибка C2873: «asinf»: символ не может использоваться в объявлении использования

[и т. Д. ...]

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

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

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

Ответы [ 4 ]

13 голосов
/ 15 ноября 2011

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

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

4 голосов
/ 21 октября 2010

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

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

0 голосов
/ 18 февраля 2016

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

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

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

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

0 голосов
/ 06 февраля 2013

Возможно, проблема в том, что библиотеки 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 ++ в файл * .c, а не в файл * .cpp.

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

...