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

Различия

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

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

Следующая версия
Предыдущая версия
c:c_ultimate_guide:preprocessor_directives [2025/10/10 16:35] – создано 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__%%                        |
 +
 +
 +===== #define =====
 +
 +определяет идентификатор и последовательность символов, которые будут подставляться вместо идентификатора каждый раз, когда он встретится в исходном файле
 +
 +<code c>
 +#include <stdio.h>
 +#define BEGIN {
 +#define END }
 +#define N 23
 +#define ADD(a,b) (a+b)
 +  
 +int main(void)
 +BEGIN
 +  int x = N;
 +  printf("Number: %d", x); // Number: 23
 +  printf("%d + %d = %d", 10, 5, ADD(10, 5)); // 10 + 5 = 15
 +  return 0;
 +END
 +</code>
 +
 +Следует учитывать, что директива препроцессор **не** заменяет последовательности символов в двойных и одинарных кавычках и в комментариях
 +
 +++++NTB|
 +Макрос можно определять в компиляторе, например ''gcc -D ИЛЕНТИФКАТОР=ЗНАЧЕНИЕ''
 +++++
 +
 +===== #undef =====
 +
 +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 =====
Строка 59: Строка 172:
 ++++ ++++
  
-===== #define =====+===== #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> <code c>
 #include <stdio.h> #include <stdio.h>
-#define N 23 +#line 100 "custom_file.c" // Устанавливает номер строки и имя файла 
-   + 
-int main(void){ +int main(void) { 
-  int x = N; +  printf("Hello from line %d of %s\n", __LINE__, __FILE__);
-  printf("Number: %d", x); // Number: 23+
   return 0;   return 0;
 } }
 </code> </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>
 +
 +===== # =====
 +
 +Пустая директива # не выполняет никаких действий, но может использоваться для организации или форматирования кода.