#define директивы не работают вне функции main ()

Я только начал изучать 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
}

Как насчет первого блока кода неверно? основываясь на учебнике, который я использую, я подумал, что именно так он и должен быть отформатирован?

РЕДАКТИРОВАТЬ: я обновил свой код, чтобы быть более четким.

-2

Решение

Это не имеет ничего общего с форматированием. На самом деле, файлы C ++ не зависят от форматирования. Проблема в том, что после того, как препроцессор проанализирует ваш файл, вы получите 2 cout заявления за пределами main функция. В C ++ вы не можете иметь автономные операторы вне функции, кроме объявлений / определений.

3

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

Вы должны понимать, что компиляция программы на 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 ++.

3

Проблема в использовании cout << вне основной функции.
Если вы хотите иметь какую-либо строку вывода, вы можете использовать #error директива прервать процесс компиляции.

1
По вопросам рекламы [email protected]