相关疑难解决方法(0)

gcc的__attribute __((打包))/ #pragma包不安全吗?

在C中,编译器将按照声明它们的顺序布置结构的成员,在成员之间插入可能的填充字节,或者在最后一个成员之后插入,以确保每个成员正确对齐.

gcc提供了一种语言扩展,__attribute__((packed))它告诉编译器不要插入填充,允许结构成员不对齐.例如,如果系统通常要求所有int对象都具有4字节对齐,则__attribute__((packed))可能导致int在奇数偏移处分配struct成员.

引用gcc文档:

`packed'属性指定变量或结构字段应该具有尽可能小的对齐 - 变量的一个字节和字段的一个位,除非您使用`aligned'属性指定更大的值.

显然,使用此扩展可以导致更小的数据要求但代码更慢,因为编译器必须(在某些平台上)生成代码,以便一次一个字节地访问未对齐的成员.

但有任何不安全的情况吗?编译器是否始终生成正确(但速度较慢)的代码来访问打包结构的未对齐成员?在所有情况下都可以这样做吗?

c gcc pragma-pack

149
推荐指数
4
解决办法
11万
查看次数

什么时候uint8_t≠unsigned char?

根据C和C++ , CHAR_BIT >= 8.
但无论何时CHAR_BIT > 8,uint8_t甚至都不能表示为8位.
它必须更大,因为它CHAR_BIT是系统上任何数据类型的最小位数.

什么样的系统可以uint8_t合法地定义为除了以外的类型unsigned char

(如果C和C++的答案不同,那么我想知道两者.)

c c++ types unsigned-char uint8t

59
推荐指数
3
解决办法
2万
查看次数

有没有理由不使用固定宽度整数类型(例如uint8_t)?

假设您使用的是支持C99(甚至只是stdint.h)的编译器,是否有任何理由不使用固定宽度整数类型,如uint8_t?

我所知道的一个原因是,char在处理字符而不是使用s时使用s 更有意义(u)int8_t,如本问题所述.

但是如果你打算存储一个数字,你何时想要使用一种你不知道它有多大的类型?即在什么情况下你想要在unsigned short不知道它是8,16甚至32位的情况下存储一个数字,而不是使用uint16t

接下来,使用固定宽度整数或使用普通整数类型并且从不假设任何东西并且使用sizeof它们需要知道它们使用了多少字节时,它被认为是更好的做法吗?

c byte integer sizeof c99

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

使用(或不使用)stdint的原因

我已经知道stdint用于当你需要特定的变量大小来实现平台之间的可移植性时,我现在还没有真正有这样的问题,但除了已经在上面显示的事实之外,使用它的缺点和优点是什么?

在stackoverflow和其他网站上寻找它,我找到了2个关于主题的链接:

  • 1 - 这个讨论了stdint的可移植性.

  • 2 - 这个更具体的关于uint8_t.

这两个链接非常好,特别是要了解更多关于这个标题的可移植性的主要原因,但对我来说,我最喜欢它,我认为uint8_t比unsigned char更清洁(例如存储RBG通道值) ,int32_t看起来比简单的int等更有意义.

所以,我的问题是,究竟是什么缺点,特别是除了可移植性之外使用stdint的优点,我应该只在代码的某些特定部分使用它,还是在任何地方?如果到处都是,我怎样才能使用atoi,strtok等功能呢?

谢谢!

c char stdint

46
推荐指数
4
解决办法
2万
查看次数

定义一个字节的方法很多

我在objective-c中使用哪一个(特别是在iOS上)会有所不同吗?我认为它来自从C和它的类型继承,以及继承从Mac OS,iOS系统是基于类型的,但我不知道我应该使用哪一个:

unsigned char 从......好......编译器?

uint8_t 来自stdint.h

UInt8 来自MacTypes.h

Byte 来自MacTypes.h

Bytef 来自zconf.h

我知道各种defs是出于可移植性的原因,并且使用类似的文字unsigned char并不是一个好的未来想法(大小可能会改变,事情最终会像Windows API一样).我想就如何找到最适合我的用途的一些建议.如果我只是愚蠢的话,还是好舌头鞭挞......

编辑:只是为了更多的信息,如果我想要的东西总是 1字节,我应该使用uint8_t(看起来不会像这样的名字改变)?我想UInt8也不会改变,但我发现UInt32的定义因处理器是否为64位而有所不同.

进一步编辑:当我说字节时,我特别指的是我想要8位.我正在进行像素压缩操作(32位 - > 8位)用于磁盘存储.

byte typedef objective-c ios

23
推荐指数
1
解决办法
7965
查看次数

pragma pack(1)也不是__attribute __((aligned(1)))有效

我的代码过去常用,但现在结构大小突然是16个字节.它曾经是13个字节.我最近从Xcode 4.2升级到Xcode 4.3.1(4E1019).

#pragma pack(1)
struct ChunkStruct {
    uint32_t width;
    uint32_t height;
    uint8_t bit_depth;
    uint8_t color_type;
    uint8_t compression;
    uint8_t filter;
    uint8_t interlace;
};
#pragma pack()
STATIC_ASSERT(expected_13bytes, sizeof(struct ChunkStruct) == 13);
Run Code Online (Sandbox Code Playgroud)

我试过不成功的使用

#pragma pack(push, 1)
/* struct ChunkStruct { ... }; */
#pragma pack(pop)
Run Code Online (Sandbox Code Playgroud)

我也试过以下,但没有运气

struct ChunkStruct {
    uint32_t width;
    uint32_t height;
    uint8_t bit_depth;
    uint8_t color_type;
    uint8_t compression;
    uint8_t filter;
    uint8_t interlace;
} __attribute__ ((aligned (1)));
Run Code Online (Sandbox Code Playgroud)

如何用Xcode 4.3.1打包结构?

pragma llvm pack xcode4

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

uint8_t可以是非字符类型吗?

这个答案和附带的评论中,Pavel Minaev提出以下论点:在C中,uint8_t可以使用typedef 的唯一类型是charunsigned char.我正在看这个 C标准草案.

  • 存在uint8_t意味着存在相应的类型int8_t(7.18.1p1).
  • int8_t 是8位宽,没有填充位(7.18.1.1p1).
  • 相应的类型具有相同的宽度(6.2.5p6),因此uint8_t也是8位宽.
  • unsigned charCHAR_BIT位宽(5.2.4.2.1p2和6.2.6.1p3).
  • CHAR_BIT 至少是8(5.2.4.2.1p1).
  • CHAR_BIT最多为8,因为它们uint8_tunsigned char,或者它unsigned char是非位域类型,其宽度是CHAR_BIT(6.2.6.1p4)的倍数.

根据这个论点,我同意,如果uint8_t存在,那么它和它unsigned char具有相同的表示:8个值位和0个填充位.这似乎并不强迫它们成为同一类型(例如,6.2.5p14).

是否允许对uint8_t具有相同表示的扩展无符号整数类型(6.2.5p6)进行typedef unsigned char当然它必须是typedef'd(7.18.1.1p2),并且它不能是除unsigned char(或者char它恰好是无符号)之外的任何标准无符号整数类型.这个假设的扩展类型不是字符类型(6.2.5p15),因此不符合对不兼容类型(6.5p7)的对象的别名访问,这让我觉得编译器编写者想要这样做的原因事情.

c language-lawyer

15
推荐指数
2
解决办法
1227
查看次数

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

对于Apple实现(Cocoa/CocoaTouch),uint8_t总是与unsigned char相同的类型?

在浏览iPhone的示例代码应用程序时,我发现了一对有效具有相同签名定义的发送/接收方法,但与其中一个变量关联的值类型除外.

从标题内:

- (void)receivedData: (unsigned char *)data length:(NSUInteger)len;
- (void)sendData:     (uint8_t*)       data length:(NSUInteger) len;
Run Code Online (Sandbox Code Playgroud)

这些方法用作发送/接收进程的包装器,它有效地传递指向byte正在写入数据流和从数据流写入的数据数组的指针.我发现这些方法签名有点好奇,因为我是Cocoa/Cocoa Touch dev的新手,所以我决定查看该uint8_t类型的定义.我发现它uint8_t被定义为unsigned char内部stdint.h,因此,data这些方法的变量完全相同.至少,stdint.h在XCode 4.2中链接的情况就是如此.

然而,对uint8_t类型进行了一些进一步的研究,我发现了关于与使用的问题.共识似乎是这两种值类型完全相同但是对于C标准库的一些实现,它们可能是不同的.因此,人们不应相信在生成可移植代码时它们将是相同类型的数据.uint8_tunsigned char

话虽如此,从Apple/Objective-C编程环境中假设是否可以安全地uint8_t使用,unsigned char或者我应该遵循上述问题中给出的相同建议吗?

这可能看起来像一个挑剔的问题,但是因为我可能正在集成库,这种类型的编码错误行为似乎在个人代码库中有点普遍,可以在多个Apple环境中使用(相当长一段时间)来了),我想进一步评论.

c xcode cocoa cocoa-touch objective-c

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

字节类型:std::byte vs std::uint8_t vs unsigned char vs char vs std::bitset<8>

C++ 有很多类型模糊地描述相同的事物。假设我们正在针对一个字节为 8 位的架构进行编译,则以下所有类型都大致相似:

  • std::byte
  • std::uint8_t
  • std::bitset<8>
  • unsigned char(8 位)
  • char(8 位)

如果一个字节是 8 位,那么所有这些类型或多或少可以互换吗?如果没有,什么时候需要使用一个而不是另一个?

我经常在 Stack Overflow 上看到诸如将十六进制字符串转换为字节数组之类的问题,其中有人使用std::uint8_tcharunsigned char其他类型来表示“字节”。这只是风格偏好的问题吗?


注意:此问答旨在成为社区常见问题解答,鼓励进行编辑。std::byte尽管 C++17 已经引入了这似乎使得选择变得显而易见,但何时使用“字节”的类型以及为什么的问题始终出现。std::bitset提供一个常见问题解答来解决有关、std::uint8_t等作为“字节”的所有误解是很有用的。鼓励编辑。

c++ byte c++17 std-byte

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

Intel 64 (EM64T)系统上char类型的大小

我听说某些 64 位系统上有 16 位长字符类型。Intel 64 (EM64T) 系统上的 char 类型的大小是多少?

c c++ 64-bit

3
推荐指数
1
解决办法
6699
查看次数

C/C++/C#:如何做"mount -a"

题:

在C/C++/C#中.(我需要它用于C#,但C和C++也很好).

如何在Linux上安装-a.我的意思是编程,没有开始像这样的过程

system("mount -a");
Run Code Online (Sandbox Code Playgroud)

编辑:
注意"-a".
我的问题实际上并不是关于如何挂载A挂载点.
它是关于如何在/ etc/fstab中挂载所有挂载点.
这意味着解析文件,解压缩挂载点,检查是否已挂载,并且只有在尚未挂载的情况下才挂载...

c c# c++ linux system-calls

3
推荐指数
3
解决办法
3585
查看次数

如何将 byte[] 放入 capnp::Data

在官方网站上,有一个很好且相对全面的示例,说明如何使用 CapnProto 进行 C++ 序列化。缺少的是如何处理第二个 Blob 类型capnp::Data,因为只capnp::Text涉及到。

为了完整起见,这里是架构语言关于 blob 类型的说明:

Blob:文本、数据

...

  • 文本始终采用 UTF-8 编码并以 NUL 结尾。

  • 数据是完全任意的字节序列。

所以,如果我有以下架构

struct Tiding {
    id @0 :Text;
    payload @1 :Data;
}
Run Code Online (Sandbox Code Playgroud)

我可以像这样开始构建我的消息

::capnp::MallocMessageBuilder message;
Tiding::Builder tiding = message.initRoot<Tiding>();

tiding.setId("1");
Run Code Online (Sandbox Code Playgroud)

在这一点上,我被卡住了。我不能这样做:

typedef unsigned char byte;

byte data[100];
... //populate the array
tiding.setPayload(data)
//error: no viable conversion from 'byte [100]' to '::capnp::Data::Reader'
Run Code Online (Sandbox Code Playgroud)

所以我四处乱逛,看到 capnp::Data 正在包装kj::ArrayPtr<const byte>,但我无法以某种方式获得ArrayPtr,更不用说使用它来设置我的消息的 Payload 字段了。

我看到有一种方法可以为类型Data(即payload @5 :Data …

c++ c++11 capnproto

0
推荐指数
1
解决办法
2092
查看次数