specifiers number examples c gcc string-formatting printf gcc-warning

number - printf(% c



¿Por qué gcc-Wall advierte sobre una cadena de formato de longitud cero? (3)

El hecho de que GCC emita una advertencia por lo general no tiene nada que ver con si la construcción es legal C, sino si los desarrolladores de GCC consideran que es una posible indicación de que usted quiso decir algo distinto de lo que escribe, o simplemente un estilo malo. Aquí hay unos ejemplos:

  • if (x = 0) - seguramente quiso decir if (x == 0) .
  • printf(str) : seguramente quiso decir fputs(str, stdout) o printf("%s", str) ; Como está escrito, el código es muy peligroso.
  • if (foo == bar & MASK) - seguramente quiso decir if (foo == (bar & MASK)) .

etc.

En su caso, creo que GCC está cuestionando por qué llama a sprintf(String, "") para hacer el equivalente de String[0]=0; (Este último es mucho más corto, más rápido y más claro).

Busqué un poco por información sobre esto pero no encontré nada satisfactorio. ¿Hay algún comportamiento especial a la llamada de función?

sprintf(someString, "");

eso explica por qué esto es una advertencia (en gcc con -Wall)? Solo logré encontrar que el estándar C permite cadenas de formato de longitud cero.

Probé el siguiente ejemplo

#include <stdio.h> int main() { char str[2] = {''a'', ''a''}; sprintf(str, ""); printf("/'%c/'/'%c/'/n", str[0], str[1]); return 0; }

que se imprime

''''''a''

que es exactamente lo que esperaba ver. Entonces, ¿por qué la advertencia?


Es simplemente una advertencia de GCC. Si desea suprimirlo para una parte de su aplicación, puede hacer lo siguiente:

#pragma GCC diagnostic ignored "-Wformat-zero-length" int main() { // code that produces a warning } #pragma GCC diagnostic warning "-Wformat-zero-length"


Recibirá la advertencia porque gcc sabe que el segundo argumento de sprintf() debe ser una cadena no vacía, generalmente una con varias especificaciones de formato, una llamada funcionalmente equivalente y "más legal" a la que está haciendo en su el código sería sprintf(str, "%s", "") . Además, casi siempre hay uno a N argumentos adicionales, suficientes para cumplir con las especificaciones de formato. Como lo está utilizando aquí, lo está utilizando como un tipo de strcpy() , que, aunque técnicamente válido, es una forma muy extraña de usar la biblioteca estándar.