gpt4 book ai didi

c - gcc(windows + MinGW) 是否在 inttypes.h 中定义了 SCNd8、SCNu8?

转载 作者:太空狗 更新时间:2023-10-29 14:55:38 26 4
gpt4 key购买 nike

#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 位整数的宏(SCNd8SCNu8)。这些宏在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com