代码之家  ›  专栏  ›  技术社区  ›  Ethan Heilman

与平台无关的C格式说明符?

  •  69
  • Ethan Heilman  · 技术社区  · 16 年前

    我想打印出一个类型的变量 size_t 在C中,但看起来 西泽特 在不同的体系结构上被命名为不同的变量类型。例如,在一台计算机(64位)上,以下代码不会引发任何警告:

    size_t size = 1;
    printf("the size is %ld", size);
    

    但在我的另一台机器(32位)上,上述代码产生以下警告消息:

    警告:格式“%ld”需要类型 “long int*”,但参数3的类型为 “西塞特*”

    我怀疑这是由于指针大小的不同,所以在我的64位机器上 尺寸 别名为 long int ( "%ld" ,而在我的32位机器上 西泽特 是另一种类型的别名。

    是否有专门用于 西泽特 是吗?

    3 回复  |  直到 10 年前
        1
  •  98
  •   Adam Rosenfield    16 年前

    是的:使用 z 长度修改器:

    size_t size = sizeof(char);
    printf("the size is %zd\n", size);  // decimal size_t
    printf("the size is %zx\n", size);  // hex size_t
    

    其他可用的长度修改器是 hh (用于 char ),请 h (用于 short ) l (用于 long ) ll (用于 long long ) j (用于 intmax_t ) t (用于 ptrdiff_t ) L (用于 long double )见C99标准第7.19.6.1(7)条。

        2
  •  32
  •   maxschlepzig    12 年前

    是的,有。它是 %zu (按照ANSI C99的规定)。

    size_t size = 1;
    printf("the size is %zu", size);
    

    注意 size_t 是无符号的,因此 %ld 双错误:错误的长度修饰符和格式转换说明符。如果你想知道, %zd 是为了 ssize_t (签字)。

        3
  •  -1
  •   Arkantos    10 年前

    MSDN 表示Visual Studio支持32位和64位平台上可移植代码的“i”前缀。

    size_t size = 10;
    printf("size is %Iu", size);