Ich bin dabei, Compilerwarnungen in einem vererbten Projekt zu reparieren, das ich geerbt habe. Neuer Compiler ist gcc Version 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC).C++ printf Feldbreite Specifier '. *' Erwartet int nicht size_t
Ihr ist viel Code wie folgt aus:
#include <cstdio>
#include <cstring>
struct foobar
{
char field1[10];
char field2[5];
};
int main()
{
struct foobar foo;
memset(&foo, ' ', sizeof(foo));
strncpy(foo.field1, "1234567890", sizeof(foo.field1));
// Produces warning
printf("[%.*s]", sizeof(foo.field1), foo.field1);
return 0;
}
dies eine Warnung Meldungen erzeugt: ‚*‘
1_test.c: In function ‘int main()’:
1_test.c:16:49: warning: field precision specifier ‘.*’ expects argument of type ‘int’, but argument 2 has type ‘long unsigned int’ [-Wformat=]
printf("[%.*s]", sizeof(foo.field1), foo.field1);
Dies scheint falsch zu mir wie ein size_t erwarten sollte, aber anscheinend es nicht ...
Gibt es trotzdem, um dieses Problem global zu beheben, abgesehen davon, dass etwas wie folgt zu tun ist:
// Fixes
printf("[%.10s]", foo.field1);
// Fixes
printf("[%.*s]", static_cast<int>(sizeof(foo.field1)), foo.field1);
zu verwenden Ich wollte gerade sagen "verwenden' static_cast' ", aber Sie haben Recht, das ist eine hässliche Lösung. –
printf ist nicht C++ – Slava
@Slava Es ist nicht C++, aber es ist ein Teil davon – KABoissonneault