La opción de definir la macro gcc no funciona para la cadena

Código de muestra:

main() { printf("%d\n", MARCO); // printf("%s\n", MARCO); } 

Cuando trato de usar la opción gcc -D , encontré que el siguiente comando funciona:

 gcc -D MARCO=12345 test.c 

pero cuando cambio 12345 a una cadena:

 gcc -D MARCO=abcde test.c 

se produce un error:

 error: 'abcde' undeclared (first use in this function) 

He intentado -DMARCO=abcde , -DMARCO="abcde" , -D MARCO="abcde" ; Todos fallaron con ese error.

¿Esta opción -D solo admite enteros?

El problema es que el shell reconoce y elimina las comillas dobles, a menos que evite que el shell lo haga escapando las comillas dobles (con barras invertidas) o encerrándolas entre comillas simples (que es lo que yo usaría):

 gcc -DMARCO='"abcde"' test.c 

Las comillas simples son eliminadas por el shell, pero eso significa que las comillas dobles son vistas por el preprocesador C. Necesitas usar el formato %s , por supuesto.

Al cambiar la macro, puede alinear un nombre sin comillas en la línea de comandos:

 #include  #define STRINGIFY(x) #x #define MACRO(x) STRINGIFY(x) int main(void) { printf("%s\n", MACRO(MARCO)); return(0); } 

Comstack eso con gcc -o testprog -DMARCO=abcde test.c y encontrarás que produce la respuesta correcta.

La macro MARCO se reemplaza literalmente por la cadena que ingresó y solo entonces se comstack el código. Como no hay comillas alrededor de la cadena (las comillas dobles en dos de los ejemplos son interpretadas como delimitadores por el shell), el abcde no se interpreta como una cadena, sino como un identificador. Como no está definido, el código no se comstack.

También puedes usar así …

-DMACRO="\"abcde\""

Ref .: ¿Cómo paso una cadena entre comillas con -D a gcc en cmd.exe?