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

gam*_*boy 5 c gcc mingw c99

#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;
}
Run Code Online (Sandbox Code Playgroud)

我无法使用最新的gcc + MinGW + Netbeans + Windows编译此代码.Netbeans说"无法解析标识符SCNd8和SCNu8".我在gcc手册页上找不到SCNd8和SCNu8的任何参考,尽管http://linux.die.net/include/inttypes.h定义了它们.使用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"    
Run Code Online (Sandbox Code Playgroud)

tom*_*gic 5

您可以在之后添加以下内容#include <inttypes.h>

#ifndef SCNd8
  #define SCNd8 "hhd"
#endif
#ifndef SCNu8
  #define SCNu8 "hhu"
#endif
Run Code Online (Sandbox Code Playgroud)

这应该适合大多数平台。

澄清:其中“大多数平台”是指具有符合 C99 标准的fscanf/的平台scanf,可以处理hh的前缀char,而不仅仅是h的前缀short


Mic*_*urr 5

有趣 - 我安装了 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;
}
Run Code Online (Sandbox Code Playgroud)

我收到以下警告:

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
Run Code Online (Sandbox Code Playgroud)

因此,似乎 GCC 4.5.1 和/或 glibc 不支持“%hhd”和“%hhu”C99 格式说明符。如果我在调试器下运行该程序,不仅仅是字节变量结束了由被修改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
Run Code Online (Sandbox Code Playgroud)

请注意,各种字符大小的 int 输入格式(使用“hh”)inttypes.h只有在指定 C99 标准时才会被编译 - 它们受以下保护:

#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
Run Code Online (Sandbox Code Playgroud)

其他格式说明符甚至为 C90 编译而编译。

因此,除非您使用-std=c99or-std=gnu99选项,否则您将不会获得“hh”格式(但请记住,它们似乎无论如何都不起作用)。


更新:

当然!不支持“hhd”和“hhu”说明符的原因是因为 MinGW 运行时使用scanf()来自微软的msvcrt.dll,它对 C99 输入格式中的新东西一无所知。如果你想使用这些输入格式,你需要使用其他一些scanf()实现。

正如 MinGW 中提到的inttypes.h

MS 运行时 scanf 似乎将“hh”视为“h”