Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

238
Vistas
Cómo crear un literal de cadena a partir de la variable definida por el compilador -D de una ruta de Windows

En Windows, tengo una variable de entorno que contiene una ruta al estilo de Windows. Me gustaría construir ese camino en mi programa e imprimirlo. Entonces, si mi ruta es c:\top, la paso al compilador usando -DTOP=$(TOP). Tenga en cuenta que no puedo convertirlo a c:\\top antes de pasarlo al compilador.

En este momento, tengo el equivalente a:

 #define TOP=c:\top

Quiero el equivalente a:

 char path[]="c:\\top";

No puedo simplemente usar el operador de stringificación:

 #define WRAP1(X) #X #define WRAP(X) WRAP1(X) char path[] = WRAP(TOP);

Eso solo da como resultado la cadena "c:\top" que el compilador ve como una secuencia de escape (es decir, \t).

Creo que una posible solución sería construir un literal de cadena, pero otras soluciones también estarán bien. ¿Hay alguna manera de usar macros para construir un literal de cadena que produzca:

 char path[] = R"foo(c:\top)foo";

Hasta ahora, todos mis intentos han fallado por motivos relacionados con las variaciones de "o ( ) o \ .

Gracias.

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Puede convertir su ruta definida en una cadena prefijándola con el operador de cadena #. Sin embargo, esto solo funciona en macros. En realidad, necesita una macro doble para que funcione correctamente; de lo contrario, solo se imprime TOP. También es importante colocar el nombre de la ruta entre comillas ; oh, el ejemplo tiene la ruta almacenada bajo el env PathDirName

Definición de la ruta para el compilador -

 /DTOP="\"$(PathDirName)\\""

Usando dentro del código

 #define STRINGIZE2(x) #x #define STRINGIZE(x) STRINGIZE2(x) char path[] = STRINGIZE(TOP);

Esto ha funcionado para mí. Casi lo hiciste funcionar, así que espero que esto ayude.

[EDITAR] Puedo ver el problema ahora - dentro de C:\top - está tomando la 'barra invertida t' como un código de control - '\t'. Este appoarch se está convirtiendo en una pesadilla para resolverlo, ya que realmente necesita crear el nombre del archivo con dos barras o usar barras diagonales. Siento que tengo problemas confusos aquí al responder antes de revisar completamente lo que sucedió. He probado varios métodos, pero al no poder cambiar la definición pasada, solo puedo sugerir usar una biblioteca de expresiones regulares o escanear manualmente la cadena, reemplazando los caracteres de control con la letra '\' correcta.

He creado un ejemplo que muestra esto solo con '\ t' en su ejemplo: no es un código agradable, está escrito para explicar lo que se está haciendo, espero que brinde un ejemplo visual y lo haga (de una manera no tan agradable) ) resuelva el problema ÚNICO que tiene con 'C: \ top' ... como he dicho, si usa este método, deberá manejar todos los códigos de control. :-)

 char stringName[256]; char* pRefStr = STRING(TOP); char* pDestStr = stringName; int nStrLen = strlen( pRefStr ); for( int nIndex = 0; nIndex < nStrLen; nIndex++ ) { if ( *pRefStr == '\t' ) { *pDestStr++ = '\\'; *pDestStr++ = 't'; pRefStr++; } else { *pDestStr++ = *pRefStr++; } } *pDestStr = '\0';

Una vez más, disculpe cualquier confusión, dejé mi respuesta aquí como referencia para usted, y espero que alguien encuentre una forma de manejar la cadena de definición (con los caracteres de control).

gracias neil

over 4 years ago · Santiago Trujillo Denunciar

0

La sintaxis bastante extraña que está buscando realiza el reemplazo de subcadenas sobre la marcha en la expansión variable, así como algunas comillas que se escapan para hacer que la definición sea una cadena. Encontré la información de reemplazo de la subcadena aquí .

set DIR=C:\WINDOWS obtiene el conjunto de var env, y luego tenemos un programa de prueba:

 #include <stdio.h> #define STR(x) #x #define STRING(x) STR(x) int main( int argc, char* argv[] ) { printf( "DIR: %s\n", STRING(DIR) ); return 0; }

Como no puede citar en el shell, puede hacer una cadena aquí, pero aún debe hacer el reemplazo de la subcadena variable.

Pase la variable env a través de cmd.exe:

 gcc -Wall -DDIR=%DIR:\=\\% main.c

Consulte el enlace anterior para obtener más información o el reemplazo de subcadenas de Google. No puedo encontrar un enlace a ninguna información de Microsoft sobre la función (¡qué sorpresa!)

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda