Я только начал изучать C ++ сегодня. С предыдущими знаниями по другим языкам у меня все хорошо, но я запутался в директивах #define.
У меня есть этот код в моем C ++ файле «обзора»:
#include <iostream>
#define TEST //object-like macro
#ifdef TEST //if TEST is defined
std::cout << "This works!" << std::endl;
#endif
#ifndef NOT_TEST //if NOT_TEST is NOT defined
std::wcout << "This also works!" << std::endl;
#endif
int main()
{
//program code
}
Приведенный выше код выдает ошибки, первая из которых syntax error : mssing ';' before '<<'
, Когда я перемещаю директивы # define / # if в основной цикл, она работает правильно:
#include <iostream>
int main()
{
#define TEST //object-like macro
#ifdef TEST //if TEST is defined
std::cout << "This works!" << std::endl;
#endif
#ifndef NOT_TEST //if NOT_TEST is NOT defined
std::wcout << "This also works!" << std::endl;
#endif
}
Как насчет первого блока кода неверно? основываясь на учебнике, который я использую, я подумал, что именно так он и должен быть отформатирован?
РЕДАКТИРОВАТЬ: я обновил свой код, чтобы быть более четким.
Это не имеет ничего общего с форматированием. На самом деле, файлы C ++ не зависят от форматирования. Проблема в том, что после того, как препроцессор проанализирует ваш файл, вы получите 2 cout
заявления за пределами main
функция. В C ++ вы не можете иметь автономные операторы вне функции, кроме объявлений / определений.
Вы должны понимать, что компиляция программы на C ++ — это двухэтапный процесс. Сначала выполняется препроцессор, который преобразует файл в соответствии с указанными вами инструкциями (те, которые начинаются с #
). Затем компилятор C ++ выполняется в результирующем файле.
«Код, относящийся к препроцессору» здесь — это просто #ifdef
/#ifndef
(с условием, которое следует за этим немедленно) и #endif
ключевые слова и, действительно, вы можете размещать их где угодно, поскольку препроцессор не заботится о синтаксисе C ++, он выполняет простые строковые операции.
Когда препроцессор запускается, он вставляет ваш код C ++ между #ifdef
а также #endif
в файл, так что эффект такой же, как если бы вы только что cout << …
линия (за пределами main
функция).
Итак, с TEST
определяется и NOT_TEST
нет, после того, как препроцессор выполнил свою работу, у вас остался файл, содержащий всего две строки:
std::cout << "This works!" << std::endl;
std::wcout << "This also works!" << std::endl;
Если вы попытаетесь скомпилировать его, вы увидите, что компилятор не в восторге, потому что это, очевидно, не допустимая программа C ++.
Проблема в использовании cout <<
вне основной функции.
Если вы хотите иметь какую-либо строку вывода, вы можете использовать #error
директива прервать процесс компиляции.