Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

235
Views
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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!