Более 200 ~СИНТАКСИЧЕСКИХ ОШИБОК~ в math.h для Visual Studio, что не имеет смысла

Использование Visual Studio Express2013 для рабочего стола Windows с проектом C++ "Консольное приложение Win32"

(Я делаю проект для курса. Чтобы начать, мне нужно импортировать все файлы проекта, предоставленные преподавателем — их очень много (все файлы .cpp и .h), так что я могу' на самом деле я не копирую и не вставляю сюда какие-либо из них... но я все равно не думаю, что проблема в этом).

Когда я нажимаю "запустить отладчик", я получаю почти 200 синтаксических ошибок в файле math.h, несмотря на то, что файл math.h входит в состав Visual Studio.

Все ошибки кажутся очень простыми, например:

"Missing ')' before identifier _X'"
"'_X' : undefined identifier"
"'floor' : definition of dllimport data not allowed"
"syntax error : missing ';' before '+'"


etc... these syntax errors go on into the 200s.

(Я бы скопировал и вставил весь журнал ошибок, но там 262 ошибки, и во всех них указан путь к каталогу, поэтому вы, ребята, не сможете его прочитать)

Почему у меня так много синтаксических ошибок в math.h, если math.h — это файл, созданный самой Visual Studio?

(Я пытался понять это несколько недель, и я не могу начать работать над проектом, пока он не скомпилируется)


person Frustrated    schedule 31.01.2015    source источник
comment
math.h — это заголовок C, вместо него используйте cmath.   -  person    schedule 01.02.2015
comment
Проверьте свои включения, включите math.h перед остальными вещами (переместите их в начало списка включений).   -  person Roman R.    schedule 01.02.2015
comment
math.h — это текстовый файл, который препроцессор просто вставляет в ваш код. Что-то в вашем собственном коде, расположенное выше точки включения, может легко испортить правильную обработку внедренного math.h. Например, то, что вы испытываете, легко достижимо, если переопределить ключевое слово как макрос. (Также, хотя и менее вероятно, здесь могут быть виноваты несовместимые настройки проекта.)   -  person AnT    schedule 01.02.2015
comment
Я предполагаю, что вы определили double как макрос. Или, может быть, float.   -  person Igor Tandetnik    schedule 01.02.2015
comment
Как насчет простой программы? #include <math.h> int main() { double d = sqrt(4.0); } Что это делает? Если он компилируется, то все эти заголовки вызывают проблему — это не имеет ничего общего с Visual Studio.   -  person PaulMcKenzie    schedule 01.02.2015
comment
Изменил на cmath.h и перенес в топ - только 16 ошибок вместо 262 нет, но все же ошибки - посмотрю и отпишусь.   -  person Frustrated    schedule 01.02.2015
comment
<math.h> является заголовком C. Его вполне допустимо использовать в коде C++, но предпочтительнее версия <cmath> для C++ (разница в том, что <cmath> помещает объявления в пространство имен std). Изменение его на <cmath.h>, вероятно, уменьшит количество ошибок - и первое, вероятно, будет заключаться в том, что <cmath.h> не существует; это <cmath>, не ‹cmath.h›`. Ваш вопрос должен включать исходный файл, который вы компилируете, предпочтительно сокращенную версию, которая воспроизводит проблему. И вам не нужно показывать нам сотни строк сообщений об ошибках, но первые несколько строк могут помочь.   -  person Keith Thompson    schedule 01.02.2015
comment
@Isaiah: Использование <math.h> в коде C++ разрешено. <cmath> предпочтительнее, но это не проблема.   -  person Keith Thompson    schedule 01.02.2015
comment
@KeithThompson Хорошо, ты сам был не уверен   -  person    schedule 01.02.2015
comment
Я вижу, вы приняли ответ, который предлагает использовать <cmath>, а не <math.h>. Оба имени заголовка допустимы, хотя <cmath> предпочтительнее; маловероятно, что использование <math.h> действительно решило вашу проблему. Пожалуйста, (а) обновите свой вопрос, чтобы показать нам фактический код, вызвавший проблему (ваш собственный код, а не заголовок <math.h>), и (б) сообщите нам, как вы на самом деле исправили это, если у вас есть.   -  person Keith Thompson    schedule 01.02.2015
comment
Я иду только по результатам. Я изменил все math.h на cmath, и он скомпилировался и теперь работает.   -  person Frustrated    schedule 02.02.2015


Ответы (2)


Проблема может заключаться в самом заголовке - C++ предоставил свои собственные эквивалентные библиотеки для старых библиотек C. Они принимают формат:

c[library name]

Где [имя библиотеки] заменено старой библиотекой C МИНУС расширением .h.

Чтобы включить math.h из библиотеки C в программу на C++, вы должны сделать следующее:

#include <cmath>

Вы также можете попробовать некоторые вещи, о которых говорят другие.

Примечание: я не уверен, являются ли источником проблемы старые заголовки C, но, поскольку C++ действительно вносил некоторые несовместимости, это вполне могло быть проблемой.

person Community    schedule 31.01.2015
comment
Эй, вот с чем у меня сейчас проблемы... вместо того, чтобы написать #include ‹cmath›, я написал #include ‹cmath.h› и изменил cmath на cmath.h с правами администратора... Это вызвало каскад, потому что другие вещи полагаются на cmath, и я изменил его на cmath.h испортил эти вызовы... теперь мне не разрешено редактировать эти файлы (т.е. xlocnum не позволяет мне редактировать их) Есть ли способ для мне изменить cmath.h обратно на cmath? - person Frustrated; 01.02.2015
comment
Удалите .h, показав расширения, щелкните файл правой кнопкой мыши и выберите «Переименовать» и нажмите «Да» в подтверждении. - person ; 01.02.2015
comment
так что получается, что 16 ошибок, связанных с тем, что cmath.h не нашел, должно быть, просто маскировали мои первоначальные 260 ошибок ... потому что теперь они все вернулись (и все в math.h, хотя я не использую math.h в любом месте...) - person Frustrated; 01.02.2015
comment
Хорошо, попробуйте полную переустановку VS - person ; 01.02.2015
comment
Согласен... Я тоже случайно удалил math.h :( - person Frustrated; 01.02.2015
comment
… Хорошо, вот совет -- не связывайтесь с заголовком системы/компилятора и нашими файлами, если только для этого нет ОЧЕНЬ особой причины (например, группа поддержки компилятора рекомендует это вам). - person ; 01.02.2015
comment
@Isaiah: Изменение имени файла, как вы предложили в своем предыдущем комментарии, - действительно плохая идея. Теперь установка OP повреждена. - person Keith Thompson; 01.02.2015
comment
@Kieth Сначала я изменил cmath на cmath.h самостоятельно, и я спрашивал, как изменить его обратно - он не был тем, кто предлагал мне изменить его. - person Frustrated; 02.02.2015
comment
А в качестве обновления, с переустановкой, и изменением math.h на cmath все работает отлично. - person Frustrated; 02.02.2015

Похоже, вы могли включить какой-то заголовочный файл до того, как упомянули #include <math.h> в своем файле cpp. Этот заголовочный файл мог пропустить ; в конце объявления класса/функции, что привело к ошибкам в math.h файле. Например,

#include "test.h"

#include <math.h>

Если в test.h отсутствует объявление класса/типа данных/функции ; в конце, это приводит к ошибкам в math.h

person Atul    schedule 31.01.2015