【发布时间】:2018-07-18 03:12:40
【问题描述】:
我正在编写一些 32 位 ANSI C,使用 gcc 编译,我需要在其中打印一些 64 位有符号和无符号整数。问题是在gcc 32 位C 中,int64_t 和uint64_t 分别转换为long long int 和unsigned long long int,格式说明符%lld 和%llu 不被ANSI 支持C. 使用inttypes.h 中提供的格式说明符宏也无济于事,因为它们会转换为%lld 和%llu。
以下代码编译失败:
#include <stdio.h>
#include <inttypes.h>
int main() {
uint64_t some_int = 123456789;
printf("Your int is: %"PRId64"\n", some_int);
return 0;
}
使用gcc main.c -ansi -Og -g -m32 -Wall -Werror -Wextra -pedantic编译
错误信息是:
error: ISO C90 does not support the ‘ll’ gnu_printf length modifier [-Werror=format=]
所以,我的问题是:我应该使用什么格式说明符来打印 32 位 ANSI C 中的双倍长度整数?
【问题讨论】:
-
所谓的ANSI C 实际上是 ISO 标准化 C 的先驱。它也非常古老,除非你有一个同样旧的编译器,否则你至少应该尝试使用the C99 standard。如今,即使是 Microsoft Visual C 编译器也支持大部分 C99。
-
"它失败了..." - 你看到了什么错误?
-
@tmaxthomas:使用此命令行的代码没有编译器错误。
-
因为
uint64_t是在 C99 标准中引入的,所以在旧编译器中确实没有可移植的方法来处理 64 位整数。为什么要将其移植到旧标准?考虑到很久以前所有三个大型编译器(GCC、Clang 和 MSVC)现在都支持 C99(甚至是全部或大部分 C11),我真的看不出有什么理由。 -
术语“ANSI C”通常用来指代 1989 年 ANSI C 标准定义的语言,它与 1990 年 ISO C 标准定义的语言相同(后来被 ANSI 采用) )。 C 标准的 1999 和 2011 版本由 ISO 发布,然后被 ANSI 正式采用。因此,该组织 ANSI 承认 ISO C11 为当前的 C 标准。由于“ANSI C”含糊不清,我建议您参考标准的年份。通过“ANSI C”,我怀疑您的意思是 C90(也可以称为 C89)。
标签: c