мета-данные страницы
Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
| c:c_ultimate_guide:preprocessor_directives [2025/10/10 17:01] – radi0dev | c:c_ultimate_guide:preprocessor_directives [2025/11/09 12:07] (текущий) – внешнее изменение A User Not Logged in | ||
|---|---|---|---|
| Строка 15: | Строка 15: | ||
| * ''# | * ''# | ||
| * ''#'' | * ''#'' | ||
| + | |||
| + | ===== макросы ===== | ||
| + | |||
| + | ^ Компилятор | ||
| + | | Borland | ||
| + | | Clang | %%__clang__%% | ||
| + | | Codeplay VectorC | ||
| + | | Digital Mars | %%__DMC__%% | ||
| + | | Gnu | %%__GNUC__%% | ||
| + | | Intel legacy “Classic” | ||
| + | | Intel LLVM based | %%__INTEL_LLVM_COMPILER__%% | ||
| + | | Microsoft | ||
| + | | Pathscale | ||
| + | | Symantec | ||
| + | | Watcom | ||
| + | |||
| + | ^ Архитектура | ||
| + | | x86 | %%_M_IX86%%, | ||
| + | | x86-64 | ||
| + | | IA64 | %%__IA64__%% | ||
| + | | DEC Alpha | %%__ALPHA__%% | ||
| + | | Motorola Power PC | %%__POWERPC__%% | ||
| + | |||
| + | ^ Архитектура | ||
| + | | Any little endian | ||
| + | | Any big endian | ||
| + | |||
| + | ^ Операционная система | ||
| + | | DOS 16 bit | %%__MSDOS__%%, | ||
| + | | Windows 16 bit | %%_WIN16%% | ||
| + | | Windows 32 bit | %%_WIN32%%, %%__WINDOWS__%% | ||
| + | | Windows 64 bit | %%_WIN64%%, %%_WIN32%% | ||
| + | | Cygwin | ||
| + | | Mingw | %%__MINGW32__%%, | ||
| + | | Linux 32 bit | %%__unix__%%, | ||
| + | | Linux 64 bit | %%__unix__%%, | ||
| + | | BSD | %%__unix__%%, | ||
| + | | Mac OS | %%__APPLE__%%, | ||
| + | | OS/2 | %%__OS2__%% | ||
| Строка 38: | Строка 77: | ||
| Следует учитывать, | Следует учитывать, | ||
| + | |||
| + | ++++NTB| | ||
| + | Макрос можно определять в компиляторе, | ||
| + | ++++ | ||
| ===== #undef ===== | ===== #undef ===== | ||
| - | {{fixme}} | + | undef отменяет действие макроcа define |
| + | |||
| + | <code c> | ||
| + | #include < | ||
| + | |||
| + | #define STRING "Good morning \n" | ||
| + | |||
| + | int main(void) | ||
| + | printf(STRING); | ||
| + | #undef STRING | ||
| + | #define STRING "Good afternoon \n" | ||
| + | printf(STRING); | ||
| + | #undef STRING | ||
| + | #define STRING "Good evening \n" | ||
| + | printf(STRING); | ||
| + | return 0; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ===== #ifdef ===== | ||
| + | |||
| + | Директива #ifdef проверяет, | ||
| + | |||
| + | <code c> | ||
| + | #include < | ||
| + | |||
| + | #define FEATURE_ENABLED | ||
| + | |||
| + | int main(void) { | ||
| + | #ifdef FEATURE_ENABLED | ||
| + | printf(" | ||
| + | #else | ||
| + | printf(" | ||
| + | #endif | ||
| + | return 0; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Если `FEATURE_ENABLED` будет отменен, | ||
| + | |||
| + | |||
| + | ===== #ifndef ===== | ||
| + | |||
| + | работает аналогично #ifdef, но проверяет ложность уловия | ||
| ===== #include ===== | ===== #include ===== | ||
| Строка 85: | Строка 171: | ||
| ++++ | ++++ | ||
| + | |||
| + | ===== #if ===== | ||
| + | Директива #if проверяет условие выражения, | ||
| + | |||
| + | <code c> | ||
| + | #include < | ||
| + | #define VERSION 2 | ||
| + | |||
| + | int main(void) { | ||
| + | #if VERSION == 1 | ||
| + | printf(" | ||
| + | #elif VERSION == 2 | ||
| + | printf(" | ||
| + | #else | ||
| + | printf(" | ||
| + | #endif | ||
| + | return 0; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ===== #else ===== | ||
| + | |||
| + | Директива #else задает альтернативное условие для директивы #if. Если предыдущее условие не было выполнено, | ||
| + | |||
| + | ===== #endif ===== | ||
| + | |||
| + | Директива #endif завершает условную блокировку, | ||
| + | |||
| + | ===== #elif ===== | ||
| + | |||
| + | Директива #elif позволяет задавать дополнительные условия в цепочке условных проверок, | ||
| + | |||
| + | ===== #line ===== | ||
| + | |||
| + | Директива #line позволяет изменять номер строки и имя файла для отчетов об ошибках, | ||
| + | |||
| + | <code c> | ||
| + | #include < | ||
| + | #line 100 " | ||
| + | |||
| + | int main(void) { | ||
| + | printf(" | ||
| + | return 0; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ===== #error ===== | ||
| + | |||
| + | Директива #error заставляет компилятор выдавать сообщение об ошибке и завершать процесс компиляции. | ||
| + | |||
| + | <code c> | ||
| + | #include < | ||
| + | |||
| + | #ifndef REQUIRED_FEATURE | ||
| + | #error " | ||
| + | #endif | ||
| + | |||
| + | int main(void) { | ||
| + | printf(" | ||
| + | return 0; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ===== #pragma ===== | ||
| + | |||
| + | Директива #pragma используется для передачи специальных инструкций компилятору. Эти инструкции __зависят от конкретного компилятора__ и могут варьироваться. | ||
| + | |||
| + | <code c> | ||
| + | #include < | ||
| + | |||
| + | #pragma message(" | ||
| + | |||
| + | int main(void) { | ||
| + | printf(" | ||
| + | return 0; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ===== # ===== | ||
| + | |||
| + | Пустая директива # не выполняет никаких действий, | ||