- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
#include <stdio.h>
#include <inttypes.h>
int main(void)
{
int8_t int8;
int16_t int16;
int32_t int32;
int64_t int64;
uint8_t uint8;
uint16_t uint16;
uint32_t uint32;
uint64_t uint64;
scanf("%"SCNd8"%"SCNd16"%"SCNd32"%"SCNd64"%"SCNu8"%"SCNu16"%"SCNu32"%"SCNu64,
&int8, &int16, &int32, &int64, &uint8, &uint16, &uint32, &uint64);
printf("%"PRId8"\n%"PRId16"\n%"PRId32"\n%"PRId64"\n%"PRIu8"\n%"PRIu16"\n%"PRIu32"\n%"PRIu64"\n",
int8, int16, int32, int64, uint8, uint16, uint32, uint64);
return 0;
}
我无法使用最新的 gcc + MinGW + Netbeans + Windows 编译此代码。 Netbeans 说“无法解析标识符 SCNd8 和 SCNu8”。虽然 http://linux.die.net/include/inttypes.h,但我在 gcc 手册页上找不到 SCNd8 和 SCNu8 的任何引用资料定义它们。我没有收到使用 PRId8 或 PRIu8 的语法错误。
MinGW inttypes.h(缺少 SCNd8 和 SCNu8)(示例代码)
#define PRIXFAST64 "I64X"
#define PRIXMAX "I64X"
#define PRIXPTR "X"
/*
* fscanf macros for signed int types
* NOTE: if 32-bit int is used for int_fast8_t and int_fast16_t
* (see stdint.h, 7.18.1.3), FAST8 and FAST16 should have
* no length identifiers
*/
#define SCNd16 "hd"
#define SCNd32 "d"
#define SCNd64 "I64d"
#define SCNdLEAST16 "hd"
#define SCNdLEAST32 "d"
#define SCNdLEAST64 "I64d"
#define SCNdFAST16 "hd"
最佳答案
有趣 - 我安装了带有 GCC 4.5.1 版的 MinGW。
inttypes.h
中的格式说明符宏大部分工作,除了用于输入 8 位整数的宏(SCNd8
和 SCNu8
)。这些宏在 inttypes.h
中定义,但尝试使用它们效果不佳。使用以下代码:
#include <stdio.h>
#include <inttypes.h>
int main(void)
{
int8_t int8 = 0;
uint8_t uint8 = 0;
scanf("%"SCNd8, &int8);
scanf("%"SCNu8, &uint8);
return 0;
}
我收到以下警告:
C:\temp\test.c: In function 'main':
C:\temp\test.c:9:5: warning: unknown conversion type character 'h' in format
C:\temp\test.c:9:5: warning: too many arguments for format
C:\temp\test.c:10:5: warning: unknown conversion type character 'h' in format
C:\temp\test.c:10:5: warning: too many arguments for format
因此,GCC 4.5.1 和/或 glibc 似乎不支持“%hhd”和“%hhu”C99 格式说明符。如果我在调试器下运行这个程序,不仅仅是字节变量 do 最终会被 scanf()
调用修改。
仅供引用,我使用以下命令进行编译:
"C:\MinGW\bin\gcc" -std=c99 -Wall -g -Ic:\MinGW\include -D_WIN32_WINNT=0x0500 "C:\temp\test.c" -lkernel32 -luser32 -lgdi32 -ladvapi32 -lshlwapi -loleaut32 -o "test".exe
请注意,inttypes.h
中的各种字符大小的 int 输入格式(使用“hh”)仅在指定 C99 标准时才被编译 - 它们受以下保护:
#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
其他格式说明符甚至在 C90 编译中也被编译。
因此,除非您使用 -std=c99
或 -std=gnu99
选项,否则您不会获得“hh”格式(但请记住它们不会无论如何似乎都有效)。
更新:
当然!不支持“hhd”和“hhu”说明符的原因是因为 MinGW 运行时使用了 Microsoft 的 msvcrt.dll
中的 scanf()
,它什么都不知道关于 C99 输入格式的新内容。如果你想使用这些输入格式,你需要使用一些其他的 scanf()
实现。
如 MinGW 的 inttypes.h
中所述:
MS runtime scanf appears to treat "hh" as "h"
关于c - gcc(windows + MinGW) 是否在 inttypes.h 中定义了 SCNd8、SCNu8?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4101335/
nb:由于评论,这个问题已经被减少了很多次。下面列出了生成错误的最少量代码。 inttypes.h 文件是从这里下载的:ffMPEG "inttypes.h not found" error ),一开
我正在重写一些代码以与 32 位和 64 位架构兼容,但我在调用 vsnprintf 时遇到了问题。 vsnprintf 似乎没有在任一架构上正确处理来自 inttypes.h 的固定大小整数类型。
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
我正在尝试按照此处所示的 OpenGL 3D 教程进行操作: http://www.arcsynthesis.org/gltut/index.html 我已经按照为构建教程编写的说明进行操作,但是当我
我有一个 C 语言代码,我将在 PIC 微 Controller 上运行。我正在使用 Mplab IDE 8.92 和 Mplab C18 3.46。我以前从未使用过微 Controller 这样做过
我当前的代码库中有以下代码片段: // uint32_t id; defined somewhere bool msb_set = id & 0x80000000 并希望将其更改为更灵活的内容: us
我正在寻找任何 GCC/MinGW 大师。我尝试使用 MinGW 在 Windows 8.1 中安装一个库,并配置说 stdint.h 和 inttypes.h 丢失: $ ./configure c
我在使用 inttypes 时遇到了一些问题,这里用这个小代码示例进行了说明: #include #include #include void print_byte(uint8_t b) {
stdint.h 和 inttypes.h 有什么区别? 如果没有使用它们,则无法识别 uint64_t,但使用它们中的任何一个,它都是定义的类型。 最佳答案 标准输入.h 如果您想使用 C99 的指
在 Windows 中使用 Visual Studio 2010 中的 ffMPEG 构建时,我遇到了 inttypes.h not found 错误。 由于通过互联网搜索导致我找到错误的解决方案,我
据我了解,当用于提取随机数时,分布不应改变。例如,对于均匀分布,当我们使用它生成随机数时,它的最小值/最大值不应改变,那么为什么 operator()不是 const 吗? 最佳答案 虽然 min()
为什么是PRIx16 == "x" in C (和 in C++ )在 GCC 下? 我希望它是 "hx",以便以下工作: #include int16_t v = -1; printf("%04"
我正在使用 Borland C++ Builder,我写了一个类,因为我正在使用“int64_t”,所以我必须在其中使用这个头文件“inttype.h”。问题是我有这个错误告诉我它可以打开这个包含文件
我想在 Visual Studio 项目中使用 C99 头文件 inttypes.h(我想打印 64 位数字)。 但是,我的安装中似乎不存在此文件。 这不是 VS2005 的一部分吗?有其他选择吗?
当我这样做 #include long long value = 0; printf("An 8 byte long integer value: %"PRId64".", value); Ecli
#include #include int main(void) { int8_t int8; int16_t int16; int32_t int32; int6
在 C++11 中,我们提供了固定宽度的整数类型,例如 std::int32_t 和 std::int64_t,它们定义在 cstdint/类型。但是,int32_t 和 int64_t 也在 std
我正在开发一个 C++ 库,其中使用 SWIG 生成其 Python 包装器。我的一些 C++ 文件使用 在 sprintf 中调用 PRId64 和其他宏。 我能够在 Scientific Linu
我是一名优秀的程序员,十分优秀!