que preprocesador preprocesado lenguaje informatica ifdef funcion entre directivas diferencia compilador c c-preprocessor stringification

lenguaje - Convierta un token de preprocesador a una cadena



que es el lenguaje preprocesado (5)

Debería usar el macro truco de stringificación de doble expansión. O solo tiene un

#define MAX_LEN 16 #define MAX_LEN_S "16" char val[MAX_LEN+1]; sscanf(buf, "%"MAX_LEN_S"s", val);

y mantenerlo sincronizado. (Eso es un poco molesto, pero siempre y cuando las definiciones estén una al lado de la otra, probablemente lo recuerdes).

En realidad, en este caso particular, ¿no bastaría con strncpy ?

strncpy(val, buf, MAX_LEN); val[MAX_LEN] = ''/0'';

Si fuera printf , sin embargo, esto sería más fácil:

sprintf(buf, "%.*s", MAX_LEN, val);

Estoy buscando una forma de convertir un token de preprocesador a una cadena.

Específicamente, he conseguido algo en alguna parte:

#define MAX_LEN 16

y quiero usarlo para evitar el desbordamiento del búfer:

char val[MAX_LEN+1]; // room for /0 sscanf(buf, "%"MAX_LEN"s", val);

Estoy abierto a otras formas de lograr lo mismo, pero solo a la biblioteca estándar.


Encontré una respuesta en línea.

#define VERSION_MAJOR 4 #define VERSION_MINOR 47 #define VERSION_STRING "v" #VERSION_MAJOR "." #VERSION_MINOR

Lo anterior no funciona, pero con suerte ilustra lo que me gustaría hacer, es decir, hacer que VERSION_STRING termine como "v4.47".

Para generar la forma numérica correcta, use algo como

#define VERSION_MAJOR 4 #define VERSION_MINOR 47 #define STRINGIZE2(s) #s #define STRINGIZE(s) STRINGIZE2(s) #define VERSION_STRING "v" STRINGIZE(VERSION_MAJOR) / "." STRINGIZE(VERSION_MINOR) #include <stdio.h> int main() { printf ("%s/n", VERSION_STRING); return 0; }


Ha pasado un tiempo, pero esto debería funcionar:

sscanf(buf, "%" #MAX_LEN "s", val);

Si no, necesitará un truco de "doble expansión":

#define STR1(x) #x #define STR(x) STR1(x) sscanf(buf, "%" STR(MAX_LEN) "s", val);


Mientras que algunas de las anteriores "funcionan", personalmente recomiendo simplemente usar una API de cadena simple en lugar del dreck que viene en libc. Hay una serie de API portátiles, algunas de las cuales también están optimizadas para facilitar la inclusión en su proyecto ... y algunas como ustr tienen una pequeña sobrecarga de espacio y soporte para variables de pila.