versiones guia español actualizar c gcc macros c-preprocessor

guia - En una macro GNS C envSet(nombre), ¿qué significa(vacío) "" nombre?



qgis español (3)

Al mirar el código, creo que el propósito es que llame a getenv la primera vez que se llama, getenv caché el resultado y luego use el resultado en caché sin tener que llamar a getenv nunca más. Si getenv se usa con un literal de cadena, entonces todas las llamadas posteriores pedirán la misma variable de entorno; si nada pudiera cambiar esa variable de entorno, en consecuencia devolverían el mismo resultado. Si al código se le diera un puntero a una cadena que posteriormente cambió, el resultado almacenado en caché probablemente no sería correcto para la nueva cadena, por lo que el "truco" es asegurar que eso no suceda.

Debido a que cada literal de cadena que se pueda usar necesitaría tener su propia variable estática asociada, el fragmento de código indicado no se puede convertir en una función. Por otro lado, la cantidad de código necesaria para cada repetición parece demasiado. Además, si la misma variable se prueba en más de un lugar en el código, cada uno podría terminar con su propio conjunto de variables y código de verificación del entorno.

Dependiendo de cómo se usará la función, puede terminar siendo mucho más rápido que el código que necesita probar una variable de entorno cada vez que se llama, y ​​puede usarse desde una función que se llama dentro de un bucle sin configuración avanzada (si código de cliente llamado función de "configuración avanzada", la búsqueda de nombre se debe hacer allí, eliminando la necesidad de verificar dentro del ciclo para ver si se ha realizado la búsqueda).

Encontré esta sintaxis hoy y no pude entender lo que significaba:

// Uses the GNU C statement expression extension #define envSet(name) ({ / static int initialised; / static bool set; / (void) "" name; / if (!initialised || !g_cacheEnv) { / const char *value = getenv(name); / set = value != NULL; / initialised = true; / } / set; / })

La línea específica que no puedo entender es:

(void) "" name; /

¿Podría alguien arrojar algo de luz sobre esto?


Dos literales de cadena consecutivos se concatenan. Presumiblemente está comprobando si name es un literal de cadena. Si no es así, el compilador informará un error.

(void) lanzamiento (void) suprimirá advertencias como "declaración sin efecto".


Parece una forma de asegurar estáticamente que el name es un literal de cadena y no otro tipo.

Si lo hace (void)"" "hello"; entonces es una expresión C válida.

Pero si haces algo como (void)"" 1; entonces obtienes un error de sintaxis.