Компилятор говорит логично и является неопределенным идентификатором

Я изучил c ++ на Mac и недавно перешел на Windows 7. Я скачал Windows v7.1 SDK и запустил установщик. Это .NET 4 зависимая версия SDK, и у меня. NET 4 установлен.

Я использую командную строку, потому что я предпочитаю ее использовать, я сделал это с помощью компилятора gcc на Mac, и у меня это хорошо получилось, учитывая, что я довольно новичок в программировании.

Я использую командную строку разработчика v7.1 sdk, потому что она устанавливает переменные среды, используя командный файл SetEnv.

Компилятор, очевидно, является компилятором cl.exe от Microsoft.

Я запустил типичную и очень простую программу hello world, в том числе getchar () в конце, которая позволила мне увидеть программу, что-то новое, поскольку mac этого не требовало. И getchar работал нормально, программа компилировалась и работала нормально.

Проблема обнаружилась, когда я попытался скомпилировать некоторый исходный код, который я написал на Mac. Который, кстати, отлично скомпилирован на маке. Это начало вызывать некоторые действительно странные ошибки, такие как сообщение мне, что логический оператор «и» является неопределенным идентификатором. Теперь я могу быть глупым здесь, но из моего понимания оператор and НЕ является идентификатором, это оператор.

Поэтому я решил сузить проблему, написав очень простую программу, в которой используются оператор «один if» и оператор «еще один» и оператор «и», и посмотрим, что произойдет. Ниже приведен код, который я пытался скомпилировать:

//hello, this is a test

#include <iostream>

int main()

{

char end;
int a = 0, b = 0;

std::cout << "If the variable a is larger than 10 and variable b is less than a, then b will be subtracted from a, else they are added.\n";
std::cout << "Enter a number for variable a\n";
std::cin >> a;
std::cout << "Now enter a number for variable b\n";
std::cin >> b;

if (a>10 and b<a) a - b;
else a+b;
std::cout << "The value of a is: " <<a;

std::cout << "Press any key to exit";
end = getchar();
return 0;
}

И это команда, которую я использовал для компиляции программы

cl /EHsc main.cpp

И наконец, что не менее важно, список ошибок, которые вызвала эта программа, почему эти ошибки здесь, я не уверен. Это просто не имеет никакого смысла для меня.

main.cpp

error C2146: syntax error : missing ')' before identifier 'and'

error C2065: 'and' : undeclared identifier

error C2146: syntax error : missing ';' before identifier 'b'

error C2059: syntax error : ')'

error C2146: syntax error : missing ';' before identifier 'a'

warning C4552: '<' : operator has no effect; expected operator with side-effect

warning C4552: '-' : operator has no effect; expected operator with side-effect

error C2181: illegal else without matching if

warning C4552: '+' : operator has no effect; expected operator with side-effect

Каждая последняя из этих ошибок странная. Я никогда не сталкивался с этим раньше, и я никогда не задавал вопрос раньше, потому что я всегда мог найти свой ответ, не спрашивая, но на этом я действительно озадачен.

-1

Решение

Это ошибка (функция) в компиляторе Microsoft Visual C ++ — она ​​не поддерживает ключевые слова and, and_eq, bitand, bitor, compl, not, not_eq, or, or_eq, xor, xor_eq, Вы должны использовать более часто используемые операторы, такие как && вместо and, || вместо or и т. д. Таблица эквивалентности:

+--------+-------+
| and    |  &&   |
| and_eq |  &=   |
| bitand |  &    |
| bitor  |  |    |
| compl  |  ~    |
| not    |  !    |
| not_eq |  !=   |
| or     |  ||   |
| or_eq  |  |=   |
| xor    |  ^    |
| xor_eq |  ^=   |
+--------+-------+

В отличие от C ++, C не предоставляет эти ключевые слова, вместо этого он предоставляет заголовок <iso646.h> с набором макросов с теми именами, которые расширяются до этих логических операторов. Это было сделано для обеспечения поддержки машин, в которых в прошлом не было необходимых символов на клавиатуре.

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

Как было отмечено здесь, более новые версии MSVC могут добавить некоторую поддержку для этого, но вы должны знать, что эти «альтернативные операторы» используются редко. Я советую вам придерживаться оригинального синтаксиса Си.

5

Другие решения

Эти альтернативные операторы определены в <iso646.h> заголовок как макрос в реализации Visual C ++. Они встроены в язык C ++ вместе с другими. Либо включите этот заголовок:

#include <iso646.h>

или скомпилировать с /permisive- переключатель компилятора при использовании компилятора Visual C ++.
Разрешающий переключатель компилятора
Вам не нужно включать вышеуказанный заголовок при компиляции с GCC. Реализация GCC, кажется, уважает представление альтернативных операторов ссылка, которая гласит:

Те же слова определены в языке программирования C во включаемом файле. <iso646.h> как макросы. Поскольку в C ++ они встроены в язык, версия C ++ <iso646.h>, так же как <ciso646>, ничего не определяет.

Живой пример на Колиру

1