what va_args macro define c macros

va_args - gcc macros



¿Puedes capitalizar un token pegado en una macro? (3)

Podría hacer algo como lo siguiente (no probado, probablemente errores tipográficos ...)

#define NORMALIZE(TOK) NORMALIZE_ ## TOK

y luego para cada una de las escrituras que pueden ocurrir hacer

#define NORMALIZE_test1 test1 #define NORMALIZE_TEST1 test1

luego usa la macro NORMALIZE dentro de tu macro real algo así como

#define TEST(name, keyword) / test_ ## NORMALIZE(name): / TEST_ ## NORMALIZE(keyword) ##_KEYWORD

(pero tal vez tendrías que hacer algunas macros de ayuda intermedias hasta que consigas todas las concatenaciones correctas)

En una macro C, ¿es posible capitalizar un token pegado? Por ejemplo, actualmente tengo la siguiente macro:

#define TEST(name, keyword) / test_##name: TEST_##keyword##_KEYWORD

Invocaría esto de la siguiente manera:

TEST(test1, TEST1)

que arrojaría lo siguiente:

test_test1: TEST_TEST1_KEYWORD

Ahora, en lugar de tener que escribir el mismo nombre dos veces (una con todos los caracteres en minúscula y otra vez con todos los caracteres en mayúscula), ¿hay alguna manera de que yo pueda hacer cualquiera de las siguientes acciones y cambiar el token a letras mayúsculas? o todas las letras minúsculas?

TEST(test1) or TEST(TEST1)

Gracias, Ryan


Por lo que sé, las únicas operaciones que se pueden realizar en tokens en el preprocesador C (al menos el estándar ISO / ANSI) es reemplazarlas, "stringificarlas" o concatenarlas. Tampoco estoy enterado de ninguna extensión de GCC o MSVC que te permita hacer lo que quieras.

Sin embargo, la gente ha inventado maneras ingeniosas (o extrañas) de hacer cosas mágicas (u horribles) con macros, por lo que no me sorprendería que alguien me sorprendiera.


No es posible porque el preprocesador funciona en una secuencia de entrada de pp-token y no tiene una construcción que le permita descomponerlos de manera significativa.

Lo que el preprocesador tiene es construir para reemplazar pp-token s con macro-expansiones, concatenarlas, eliminarlas (completamente), etc.

Esto significa que su única esperanza para uppercasing es comenzar con caracteres individuales y mayúsculas y luego pegar todo junto. La duplicación de caracteres individuales es bastante sencilla ya que solo tiene un conjunto finito para trabajar. Por otro lado, sería posible unirlos, al menos si se limita a una longitud máxima fija. Usted terminaría en una macro que se usaría así:

TEST(t,e,s,t,1)