标签: stdint

编译时检查stdint.h的存在

我正在使用遗留嵌入式C代码,它使用关键字定义类型uint8_t, uint16_tuint32_t头文件typedef.

为了讨论,让我们说该文件typedefs.h包含这些定义.

在我的新C源模块中,我包括stdint.h.我还包括其他头文件,包括typedefs.h层次结构中的某个位置.正如所料,编译器抱怨多个已定义的符号.

我想修改遗留文件,typedefs.h以便它只声明uint*_t类型,如果stdint.h没有包含或更好,如果uint*_t未定义类型.

我的理解是#ifndef不能使用,因为typedef它不是预处理器指令.

那么如何告诉编译器不定义uint*_t它们是否已经存在(或者是否stdint.h已经包含)?

注意:如果C规范定义的标准包含头文件的保护定义,这将很容易.

FWIW,我正在使用Green Hills编译器4.24,用于ARM9处理器.

c typedef uint32 stdint

7
推荐指数
2
解决办法
2094
查看次数

为什么可以找到stdint.h但cstdint不行?

我很惊讶,包括stdint.h工作,但不包括cstdint.

$ aCC sizeof.cpp
"sizeof.cpp", line 5: error #2005-D: could not open source file "cstdint"
  #include <cstdint>
                    ^

1 error detected in the compilation of "sizeof.cpp".
$ aCC --version
aCC: HP C/aC++ B3910B A.06.12 [Nov 03 2006]
Run Code Online (Sandbox Code Playgroud)

它与g ++相同:

$ g++ --version
g++ (GCC) 4.2.3
Run Code Online (Sandbox Code Playgroud)

我可以问为什么?并且,有任何方法来解决这个问题,但更新编译器?谢谢.

c++ g++ acc stdint

7
推荐指数
1
解决办法
1万
查看次数

将uint32_t转换为int32_t,然后进行比较

我无法理解如何比较两个int,其中一个是unsigned int32,另一个是signed int32。让我们考虑这个简单的程序:

#include <stdint.h>

int main()
{
    uint32_t a1 = UINT32_MAX;
    int32_t b1 = (int32_t)a1;

    if (a1 == b1)
        printf("Equal");
    else
        printf("Not equal");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,a1超出了有符号的32位整数范围,因此正如我在调试时已确认的那样,在将其强制转换后,它b1等于-1。但是,它仍然显示“等于”,而这些值显然并不相同。是什么原因造成的?

c stdint

7
推荐指数
1
解决办法
73
查看次数

对于uint32_t和其他stdint类型,atoi或strtoul的等价物是什么?

我正在寻找将字符串转换为stdint.h整数的标准函数

int i = atoi("123");
unsigned long ul = strtoul("123", NULL, 10);
uint32_t n = mysteryfunction("123"); // <-- ???
Run Code Online (Sandbox Code Playgroud)

c c99 type-conversion stdint

6
推荐指数
1
解决办法
6385
查看次数

具有typedef整数的Printf,尤其是64位

考虑以下代码:

typedef int64_t Blkno;
#define BLKNO_FMT "%lld"
printf(BLKNO_FMT, (Blkno)some_blkno);
Run Code Online (Sandbox Code Playgroud)

这在x86上运行良好.在x64和int64_t实际上是一个long,而不是一个long long,并且当longlong long是在x64相同的尺寸,编译器会生成一个错误:

src/cpfs/bitmap.c:14:警告:格式'%lld'需要类型'long long int',但参数6的类型为'Blkno'

  1. 我怎么知道printf我通过64位类型?
  2. 是否有一些更好的方法来标准化用户类型的规格而不是#defineBLKNO_FMT上面那样使用?

c printf gcc typedef stdint

5
推荐指数
1
解决办法
2772
查看次数

[u]int_fastN_t 类型应该如何为 x86_64 定义,有或没有 x32 ABI?

X32 ABI指定,除其他事项外,对于x86_64体系生成的代码32位指针。它结合了 x86_64 架构(包括 64 位 CPU 寄存器)的优点和 32 位指针减少的开销。

<stdint.h>报头定义的typedef int_fast8_tint_fast16_tint_fast32_t,和int_fast64_t(和相应的无符号类型uint_fast8_t等人)中,其中的每一个是:

在所有至少具有指定宽度的整数类型中,通常操作最快的整数类型

附注:

不能保证指定的类型在所有用途中都是最快的;如果实现没有明确的理由选择一种类型而不是另一种,它只会选择一些满足符号和宽度要求的整数类型。

(引自N1570 C11 草案。)

问题是,无论有没有 x32 ABI ,应该如何为 x86_64 架构定义[u]int_fast16_t[u]int_fast32_t类型?是否有指定这些类型的 x32 文档?它们是否应该与 32 位 x86 定义(均为 32 位)兼容,或者,由于 x32 可以访问 64 位 CPU 寄存器,它们在使用或不使用 x32 ABI 的情况下是否应该具有相同的大小?(请注意,无论是否使用 x32 ABI,x86_64 都有 64 位寄存器。)

这是一个测试程序(取决于特定于 gcc 的__x86_64__宏):

#include <stdio.h>
#include <stdint.h>
#include <limits.h>

int main(void) {
#if …
Run Code Online (Sandbox Code Playgroud)

c x86-64 stdint linux-x32-abi

5
推荐指数
1
解决办法
545
查看次数

C:将字节数组声明为 uint8_t 有问题吗?

我正在开发一个使用字节数组的小型网络应用程序。传统上,这些将用类似的东西来声明char buf[] = ...

这似乎是大多数教程中(仍然?)完成的方式,但它存在一个问题,即它可能会掩盖实际发生的情况,例如,当您尝试打印这样的数组并忘记并非每个字符都是可见字符时。

有些人建议您应该chars完全停止使用,而使用现代的uint8_t. 我发现这非常有吸引力,主要是基于显式优于隐式的原则。

那么,将这些类型的数组声明为 是否有问题uint8_t buf[] = ...

c arrays char stdint uint8t

5
推荐指数
1
解决办法
870
查看次数

在 CUDA NVRTC 代码中包含 C 标准头文件

我正在编写一个在运行时使用 NVRTC(CUDA 9.2 版和 NVRTC 7.5 版)编译的 CUDA 内核,它需要stdint.h头文件,以便拥有int32_t等类型。

如果我编写没有包含的内核源代码,它可以正常工作。例如内核

extern "C" __global__ void f() { ... }
Run Code Online (Sandbox Code Playgroud)

编译为 PTX 代码,其中 f 定义为.visible .entry f.

但是如果内核源代码是

#include <stdint.h>
extern "C" __global__ void f() { ... }
Run Code Online (Sandbox Code Playgroud)

它报告A function without execution space annotations (__host__/__device__/__global__) is considered a host function, and host functions are not allowed in JIT mode.(也没有extern "C")。

传递-default-device使 PTX 代码.visible .func f,因此无法从主机调用该函数。

有没有办法在源代码中包含标题,并且仍然具有__global__入口功能?或者,一种知道 …

preprocessor cuda stdint nvrtc

5
推荐指数
1
解决办法
1051
查看次数

将uint8_t作为int8_t进行便携式重新解释并强制对其进行恭维

我试图以一种可移植的方式将uint8_t重新解释为int8_t(并再次返回).我正在通过一个存储在uint8_t缓冲区中的串行通道接收,但是一旦我知道它是什么类型的数据包,我需要将一些字节解释为两个恭维,其他字节解释为无符号.

我知道这将适用于许多编译器:

int8_t i8;
uint8_t u8 = 0x94;

i8 = (int8_t)u8;
Run Code Online (Sandbox Code Playgroud)

但是当u8> 127时无法保证工作,因为将一个大于INT8_MAX的值转换为int8_t是未定义的(我认为).

我能想出的最好的就是这个

int8_t i8;
uint8_t u8;

i8 = (u8 > INT8_MAX) ? (int8_t)(-(256-u8)):(int8_t)u8;
Run Code Online (Sandbox Code Playgroud)

这应该始终有效,因为减法总是会导致自动升级到int,并且绝不依赖于底层表示.它隐含地强制对两个大于INT8_MAX的值进行恭维解释.

有没有更好的方法(或标准的MACRO)来做到这一点?

c casting stdint

5
推荐指数
1
解决办法
91
查看次数

为什么 stdatomic.h 包含 atomic_uint_least16_t 和 atomic_uint_fast16_t 但不包含 atomic_uint16_t?

stdatomic.h似乎包含 atomic_uint_least16_tand atomic_uint_fast16_t,它们是and类型的_Atomic版本,但它不包含. 为什么?stdint.h uint_least16_tuint_fast16_tatomic_uint16_t


有关N1548 草案的一些背景信息:

7.18.1.1 精确宽度整数类型

1 typedef 名称intN_t指定宽度为 N、无填充位和二进制补码表示的有符号整数类型。因此,int8_t表示具有恰好 8 位宽度的这种有符号整数类型。

2 typedef 名称uintN_t指定宽度为 N 且无填充位的无符号整数类型。因此,uint24_t表示具有恰好 24 位宽度的这种无符号整数类型。

3 这些类型是可选的。但是,如果实现提供宽度为 8、16、32 或 64 位、无填充位且(对于有符号类型)具有二进制补码表示的整数类型,则应定义相应的 typedef 名称。

7.18.1.2 最小宽度整数类型

1 typedef 名称int_leastN_t指定宽度至少为 N 的有符号整数类型,这样尺寸较小的有符号整数类型都不会至少具有指定的宽度。因此,int_least32_t表示宽度至少为 32 位的有符号整数类型。

2 typedef 名称uint_leastN_t指定宽度至少为 N 的无符号整数类型,因此没有较小尺寸的无符号整数类型至少具有指定的宽度。因此,uint_least16_t表示宽度至少为 16 …

c language-lawyer stdint c11 stdatomic

4
推荐指数
1
解决办法
137
查看次数