我正在使用遗留嵌入式C代码,它使用关键字定义类型uint8_t, uint16_t和uint32_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处理器.
我很惊讶,包括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)
我可以问为什么?并且,有任何方法来解决这个问题,但更新编译器?谢谢.
我无法理解如何比较两个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。但是,它仍然显示“等于”,而这些值显然并不相同。是什么原因造成的?
我正在寻找将字符串转换为stdint.h整数的标准函数
int i = atoi("123");
unsigned long ul = strtoul("123", NULL, 10);
uint32_t n = mysteryfunction("123"); // <-- ???
Run Code Online (Sandbox Code Playgroud) 考虑以下代码:
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,并且当long和long long是在x64相同的尺寸,编译器会生成一个错误:
src/cpfs/bitmap.c:14:警告:格式'%lld'需要类型'long long int',但参数6的类型为'Blkno'
printf我通过64位类型?#define像BLKNO_FMT上面那样使用?的X32 ABI指定,除其他事项外,对于x86_64体系生成的代码32位指针。它结合了 x86_64 架构(包括 64 位 CPU 寄存器)的优点和 32 位指针减少的开销。
的<stdint.h>报头定义的typedef int_fast8_t,int_fast16_t,int_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) 我正在开发一个使用字节数组的小型网络应用程序。传统上,这些将用类似的东西来声明char buf[] = ...。
这似乎是大多数教程中(仍然?)完成的方式,但它存在一个问题,即它可能会掩盖实际发生的情况,例如,当您尝试打印这样的数组并忘记并非每个字符都是可见字符时。
有些人建议您应该chars完全停止使用,而使用现代的uint8_t. 我发现这非常有吸引力,主要是基于显式优于隐式的原则。
那么,将这些类型的数组声明为 是否有问题uint8_t buf[] = ...?
我正在编写一个在运行时使用 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__入口功能?或者,一种知道 …
我试图以一种可移植的方式将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)来做到这一点?
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 …