2

symbol.c:在函数“symbol_FPrint”中:

symbol.c:1209: warning: format '%ld' expects type 'long int', but argument 3 has type 'SYMBOL'
symbol.c: In function 'symbol_FPrintOtter':
symbol.c:1236: warning: format '%ld' expects type 'long int', but argument 3 has type 'SYMBOL'
symbol.c:1239: warning: format '%ld' expects type 'long int', but argument 3 has type 'SYMBOL'
symbol.c:1243: warning: format '%ld' expects type 'long int', but argument 3 has type 'SYMBOL'
symbol.c:1266: warning: format '%ld' expects type 'long int', but argument 3 has type 'SYMBOL' 

在符号.c

1198 #ifdef CHECK
1199     else {
1200       misc_StartErrorReport();
1201       misc_ErrorReport("\n In symbol_FPrint: Cannot print symbol.\n");
1202       misc_FinishErrorReport();
1203     }
1204 #endif
1205   }
1206   else if (symbol_SignatureExists())
1207     fputs(symbol_Name(Symbol), File);
1208   else
1209     fprintf(File, "%ld", Symbol);
1210 }

SYMBOL 定义为:

typedef size_t SYMBOL

当我用 '%zu' 替换 '%ld' 时,我收到以下警告:

symbol.c: In function 'symbol_FPrint':
symbol.c:1209: warning: ISO C90 does not support the 'z' printf length modifier

注意:从这里开始,它已于 2010 年 3 月 26 日进行了编辑,并添加了以下问题,因为它与上述问题相似。

我有以下声明:

printf("\n\t %4d:%4d:%4d:%4d:%4d:%s:%d", Index, S->info, S->weight,
       Precedence[Index],S->props,S->name, S->length);

在 64 位架构中编译时收到的警告是:

format ‘%4d’ expects type ‘int’, but argument 5 has type ‘size_t’

以下是参数的定义:

  NAT    props;
  typedef  unsigned int     NAT;

我怎样才能摆脱这个,以便我可以在 32 位和 64 位架构中编译而不发出警告?

它的解决方案是什么?

4

2 回答 2

4

使用%zu而不是%ld作为格式size_t,然后您将在 32 位和 64 位构建中获得正确的行为(并且没有警告)。

如果由于某种原因你不能使用%zu(例如旧的或非标准的编译器),那么你可以这样做:

#ifdef __LP64__ // if 64 bit environment
#define FMT_SIZE_T "llu"
#else
#define FMT_SIZE_T "lu"
#endif

然后,当您需要使用带有 size_t 类型的 printf 时,您可以这样做:

printf("(sizeof(void *) = %"FMT_SIZE_T" bytes \n", sizeof(void *));
于 2010-03-11T15:20:36.117 回答
2

我发现它是linux 上%lu唯一符合 C89(或符合 gcc-c89-warnings)的格式。size_t在 glibc 下,size_t似乎总是如此long unsigned int,所以%lu在那里是合适的。

特别是我发现带有-std=c89 -pedanticor的 gcc-4.4.3-std=c89 -Wall会对%lluand发出警告%lld。有道理,因为他们期望long longC99 类型。

可悲的是,没有办法以size_t与平台无关的 C89 兼容方式打印 a 。在 C89 中,所有 printf格式都引用特定的原始类型(long、、int等),但在所有C 方言中,size_t都是平台相关的(可能是longint其他)。

像往常一样,微软会向您扔出它自己的特殊活动扳手。Windows 编译环境是一个严重修改的 C89:它有long long,但没有llprintf 修饰符。在 windows-land 中,%llu变成%I64u%zu变成%Iu

我最终在我实验室的代码库中使用了以下内容:

#ifdef _WIN32
#define PRIuZ "Iu"
#别的
#define PRIuZ "lu"
#万一

利用:

printf("%"PRIuZ"\n", sizeof(struct foo));

我根据 C99 中的定义对名称进行了建模inttypes.h

另外:我的 win64 mingw-gcc 版本(4.4.5 20100527 (prerelease) [svn/rev.159909 - mingw-w64/oz]),加上or-Wall-pedantic在打印. 它抱怨并且不标准,这是不正确的。似乎编译器正确地被微软的疯狂所绊倒。我不得不用它来不抱怨。size_t%I64u%Iu%lu-pedantic -Wformat=0%Iu

于 2011-03-31T02:49:06.713 回答