我正在修復我繼承的遺留項目中的編譯器警告。新編譯器是gcc版本4.8.5 20150623(Red Hat 4.8.5-4)(GCC)。C++ printf字段寬度說明符'。*'預計int不是size_t
他們是許多像以下代碼:
#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;
}
這會產生一個警告信息:「*」
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);
這似乎是我錯了。應該想到的size_t,但顯然它不...
是否有無論如何解決這個問題,除了必須做以下事情之外:
// Fixes
printf("[%.10s]", foo.field1);
// Fixes
printf("[%.*s]", static_cast<int>(sizeof(foo.field1)), foo.field1);
我剛纔說「使用static_cast'」但你是對的,這是一個醜陋的解決方案。 –
的printf不是C++ – Slava
@Slava它不是C++,但它是它 – KABoissonneault