una tres todas tipos son salida procesador preprocesamiento preprocesador menciona los lenguaje las funciones funcion forma entrada encuentran ejemplos directivas directiva define declarar datos cual constante básicos c++ macros

todas - los tres tipos de datos básicos en lenguaje c++ son



Macro del preprocesador sin reemplazo C++ (3)

De acuerdo con cplusplus.com, la sintaxis para definir una macro es:

#define identifier replacement

Sin embargo, a veces tropiezo con una definición macro que no contiene un reemplazo. Por ejemplo, en afxwin.h, existe la siguiente definición de preprocesador:

#define afx_msg // intentional placeholder

Mis preguntas:

  1. ¿Qué sucede en tiempo de compilación cuando se usa una definición de preprocesador que no tiene reemplazo? ¿Simplemente se ignora? Por ejemplo, la línea afx_msg void OnAddButton(); quedar void OnAddButton(); ?
  2. ¿Cuál es el propósito de usar el preprocesador sin reemplazo? ¿Es simplemente para hacer que el código sea más claro?

  1. el preprocesador lo procesa, lo elimina y lo reemplaza sin nada
  2. podría ser una variedad de razones, incluida la legibilidad, la portabilidad, las características del compilador personalizado, etc.

"Nothing" (sin texto) es un texto de reemplazo válido para una macro. Simplemente será eliminado (más precisamente, reemplazado por nada) por el preprocesador.

Hay varias razones por las que usarías algo como esto. Una es simplemente usar la macro en #ifdef y constructrs similares.

Otra es la compilación condicional. Un caso de uso típico son las API públicas y las exportaciones de DLL. En Windows, debe marcar una función como exportada desde una DLL (cuando crea la DLL) o como importada de una DLL (cuando se vincula con la DLL). En los sistemas ELF, tales declaraciones no son necesarias. Por lo tanto, a menudo verá código como este en los encabezados de las bibliotecas públicas:

#ifdef _WIN32 #ifdef BUILDING_MYLIB #define MYLIB_API __declspec(dllexport) #else #define MYLIB_API __declspec(dllimport) #endif #else #define MYLIB_API #endif void MYLIB_API myApiFunction();

Sin embargo, otra razón podría ser herramientas de procesamiento de código. Tal vez tenga una herramienta que analiza el código fuente y extrae una lista de funciones con un marcador determinado. Puede definir dicho marcador como una macro vacía.


#define bla

simplemente define bla .

puedes usarlo con

#ifdef bla ... place some code here ... #endif

un caso de uso típico es #define DEBUG para habilitar partes de códigos especiales en el modo de depuración.

Otra forma de establecer tales cosas desde "afuera" es:

g++ -DDEBUG x.cpp

que también establece la macro DEPURACIÓN definida.

Y cada archivo de encabezado debe tener algo como:

#ifndef THIS_HEADER_INCLUDE_GUARD #define THIS_HEADER_INCLUDE_GUARD ... rest of header file ... #endif

Esto simplemente protege su archivo de encabezado para (recursivamente) leer más una vez.

Algunos se pueden hacer con #pragma once específico de implementación una #pragma once .