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:
- ¿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();
quedarvoid OnAddButton();
? - ¿Cuál es el propósito de usar el preprocesador sin reemplazo? ¿Es simplemente para hacer que el código sea más claro?
- el preprocesador lo procesa, lo elimina y lo reemplaza sin nada
- 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
.