мета-данные страницы
  •  

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
c:c_ultimate_guide:preprocessor_directives [2025/10/10 17:01] radi0devc:c_ultimate_guide:preprocessor_directives [2025/11/09 12:07] (текущий) – внешнее изменение A User Not Logged in
Строка 15: Строка 15:
   * ''#pragma'' - определяет действия, которые зависят от конкретной реализацией компилятора     * ''#pragma'' - определяет действия, которые зависят от конкретной реализацией компилятора  
   * ''#'' - пустая директива, по сути ничего не делает   * ''#'' - пустая директива, по сути ничего не делает
 +
 +===== макросы =====
 +
 +^ Компилятор                   ^ Макрос                             ^
 +| Borland                      | %%__BORLANDC__%%                  |
 +| Clang                        | %%__clang__%%                     |
 +| Codeplay VectorC            | %%__VECTORC__%%                   |
 +| Digital Mars                 | %%__DMC__%%                       |
 +| Gnu                          | %%__GNUC__%%                      |
 +| Intel legacy “Classic”      | %%__INTEL_COMPILER__%%            |
 +| Intel LLVM based            | %%__INTEL_LLVM_COMPILER__%%       |
 +| Microsoft                    | %%_MSC_VER%%                      |
 +| Pathscale                    | %%__PATHSCALE__%%                 |
 +| Symantec                     | %%__SYMANTECC__%%                 |
 +| Watcom                       | %%__WATCOMC__%%                   |
 +
 +^ Архитектура                  ^ Макрос                             ^
 +| x86                          | %%_M_IX86%%, %%__INTEL__%%, %%__i386__%%  |
 +| x86-64                       | %%_M_X64%%, %%__x86_64__%%, %%__amd64__%%  |
 +| IA64                         | %%__IA64__%%                       |
 +| DEC Alpha                    | %%__ALPHA__%%                      |
 +| Motorola Power PC            | %%__POWERPC__%%                    |
 +
 +^ Архитектура                  ^ Макрос                             ^
 +| Any little endian            | %%__LITTLE_ENDIAN__%%              |
 +| Any big endian               | %%__BIG_ENDIAN__%%                 |
 +
 +^ Операционная система         ^ Макрос                             ^
 +| DOS 16 bit                  | %%__MSDOS__%%, %%_MSDOS%%          |
 +| Windows 16 bit              | %%_WIN16%%                         |
 +| Windows 32 bit              | %%_WIN32%%, %%__WINDOWS__%%       |
 +| Windows 64 bit              | %%_WIN64%%, %%_WIN32%%             |
 +| Cygwin                      | %%__CYGWIN__%%                     |
 +| Mingw                       | %%__MINGW32__%%, %%__MINGW64__%%  |
 +| Linux 32 bit                | %%__unix__%%, %%__linux__%%        |
 +| Linux 64 bit                | %%__unix__%%, %%__linux__%%, %%__LP64__%%, %%__amd64__%% |
 +| BSD                         | %%__unix__%%, %%__BSD__%%, %%__FREEBSD__%% |
 +| Mac OS                      | %%__APPLE__%%, (%%__DARWIN__%%, %%__MACH__%%)  |
 +| OS/2                       | %%__OS2__%%                        |
  
  
Строка 38: Строка 77:
  
 Следует учитывать, что директива препроцессор **не** заменяет последовательности символов в двойных и одинарных кавычках и в комментариях Следует учитывать, что директива препроцессор **не** заменяет последовательности символов в двойных и одинарных кавычках и в комментариях
 +
 +++++NTB|
 +Макрос можно определять в компиляторе, например ''gcc -D ИЛЕНТИФКАТОР=ЗНАЧЕНИЕ''
 +++++
  
 ===== #undef ===== ===== #undef =====
  
-{{fixme}}+undef отменяет действие макроcа define 
 + 
 +<code c> 
 +#include <stdio.h> 
 +  
 +#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; 
 +} 
 +</code> 
 + 
 +===== #ifdef ===== 
 + 
 +Директива #ifdef проверяет, определен ли идентификатор. Если он определен, выполняется соответствующий код. 
 + 
 +<code c> 
 +#include <stdio.h> 
 + 
 +#define FEATURE_ENABLED 
 + 
 +int main(void) { 
 +#ifdef FEATURE_ENABLED 
 +  printf("Feature is enabled.\n"); // Этот код будет выполнен 
 +#else 
 +  printf("Feature is disabled.\n"); 
 +#endif 
 +  return 0; 
 +} 
 +</code> 
 + 
 +Если `FEATURE_ENABLED` будет отменен, код в первом блоке не выполнится. 
 + 
 + 
 +===== #ifndef ===== 
 + 
 +работает аналогично #ifdef, но проверяет ложность уловия
  
 ===== #include ===== ===== #include =====
Строка 85: Строка 171:
  
 ++++ ++++
 +
 +===== #if =====
 +Директива #if проверяет условие выражения, аналогично конструкции ''if'' в языке C.
 +
 +<code c>
 +#include <stdio.h>
 +#define VERSION 2
 +
 +int main(void) {
 +#if VERSION == 1
 +  printf("Version 1\n");
 +#elif VERSION == 2
 +  printf("Version 2\n"); // Этот код будет выполнен
 +#else
 +  printf("Unknown version\n");
 +#endif
 +  return 0;
 +}
 +</code>
 +
 +===== #else =====
 +
 +Директива #else задает альтернативное условие для директивы #if. Если предыдущее условие не было выполнено, выполняется код под **#else**.
 +
 +===== #endif =====
 +
 +Директива #endif завершает условную блокировку, начатую с #if, #ifdef или #ifndef.
 +
 +===== #elif =====
 +
 +Директива #elif позволяет задавать дополнительные условия в цепочке условных проверок, что обеспечивает удобство структурирования кода.
 +
 +===== #line =====
 +
 +Директива #line позволяет изменять номер строки и имя файла для отчетов об ошибках, которые выводит компилятор.
 +
 +<code c>
 +#include <stdio.h>
 +#line 100 "custom_file.c" // Устанавливает номер строки и имя файла
 +
 +int main(void) {
 +  printf("Hello from line %d of %s\n", __LINE__, __FILE__);
 +  return 0;
 +}
 +</code>
 +
 +===== #error =====
 +
 +Директива #error заставляет компилятор выдавать сообщение об ошибке и завершать процесс компиляции.
 +
 +<code c>
 +#include <stdio.h>
 +
 +#ifndef REQUIRED_FEATURE
 +#error "Required feature is not defined!"
 +#endif
 +
 +int main(void) {
 +  printf("Program runs successfully.\n");
 +  return 0;
 +}
 +</code>
 +
 +===== #pragma =====
 +
 +Директива #pragma используется для передачи специальных инструкций компилятору. Эти инструкции __зависят от конкретного компилятора__ и могут варьироваться.
 +
 +<code c>
 +#include <stdio.h>
 +
 +#pragma message("Compiling the program...") // Выводит сообщение во время компиляции
 +
 +int main(void) {
 +  printf("Hello, World!\n");
 +  return 0;
 +}
 +</code>
 +
 +===== # =====
 +
 +Пустая директива # не выполняет никаких действий, но может использоваться для организации или форматирования кода.