¿Por qué el comstackdor ve una falta de coincidencia entre los especificadores de conversión “s” de char * y printf cuando el caracter * está tipificado y se accede a él a través de una estructura?

¿Por qué el comstackdor se queja de un tipo de argumento “char” y un especificador de conversión “s” no coincidentes en el siguiente printf?

#include  #include  typedef char * STR; // causes problems in printf below int main(void) { struct MyStruct { STR str; }; struct MyStruct ms = {"some text"}; printf("%s\n", ms.str); return (EXIT_SUCCESS); } 

El comstackdor no tiene ninguna queja sobre el mismo código cuando se elimina typedef:

 #include  #include  //typedef char * STR; // runs fine without typedef int main(void) { struct MyStruct { char * str; //STR str; }; struct MyStruct ms = {"some text"}; printf("%s\n", ms.str); return (EXIT_SUCCESS); } 

Notas:

  • Sistema = Win 64, NetBeans IDE 8.2, comstackdor GCC, no difiere si se usan las herramientas Cygwin o MinGW, o si de 32 contra 64 bits.

  • El error se elimina si evito la estructura o el typedef. Pero el error está presente cuando se usan typedef y struct juntos como se muestra.

  • Antes de publicar, examiné (entre otros) stackoverflow.com/questions/20944784/, que aconseja el uso de const. Sin embargo, el error persiste si typedef es

    puntero a constante char (typedef char const * STR); puntero constante a char (typedef char * const STR); o puntero constante a constante char (typedef char const * const STR);

  • Mensaje de error de Verbatim: No coincide el tipo de argumento “char” y el especificador de conversión “s”.

  • Pruebas adicionales muestran que ms.str es, de hecho, del tipo char * esperado (por ejemplo, tamaño adecuado, cambiando el especificador de conversión a “c” para char como se indica en el mensaje de error, lo que resulta en una confusión como se espera si el puntero de impresión se imprime a char como un char, etc.)

  • Cambiar el nombre del identificador typedef (por ejemplo, de STR a STR_TEST) da como resultado el mismo error. Así que no parece haber conflicto con las definiciones en los encabezados estándar.

En las cámaras de eco que son los comentarios para esta pregunta, parece que esos participantes y el OP han llegado a un consenso de que esto es culpa de NetBeans.

No puedo reproducir tu problema en Cygwin x64. Además, “No coincidir con el tipo de argumento” char “y el especificador de conversión” s “” no parece una advertencia de GCC, probablemente sea un problema de Netbeans. Ver también este similar informe de error de Netbeans – RustyX 26 de mayo a las 18:51

@BloodyPeasant gcc no tiene un mensaje de error que diga “No coincide el tipo de argumento” char “y el especificador de conversión” s “.” , puede ser NetBeans el que muestra el mensaje de error en lugar de gcc, en cuyo caso NetBeans está equivocado y también tiene una gramática inglesa bastante deficiente en sus mensajes de error. – Nos 26 de mayo a las 19:33.

@nos Ha, la mala gramática es la señal reveladora de que es un problema de NetBeans … Mirando bajo el capó de NetBeans, parece que usted y RustyX tienen razón en que esto es solo una falla del IDE. Gracias a todos. – Bloody Peasant 27 de mayo a las 2:01

… y entonces tu pregunta necesita una corrección:

¿Por qué el comstackdor [NetBeans] se queja de un tipo de argumento “char” no coincidente y del especificador de conversión “s” en el siguiente printf?

Aquellos que escribieron NetBeans son personas capaces de cometer errores, y este mensaje de error es la manifestación de uno de esos errores, el síntoma de lo que comúnmente llamamos un “error”, “error técnico” o “falla de software”.