c++ 编译器在代码编写器中为sizeof(unit32_t)报告0

euoag5mw  于 9个月前  发布在  其他
关注(0)|答案(3)|浏览(115)

我在C++为基础的项目工作,我得到一个错误下面的声明:

产品代码:

typedef char pb_static_assertion_UINT32_T_WRONG_SIZE3507__COUNTER__ 
[ ( sizeof ( uint32_t ) == 4 ) ? 1 : - 1 ] ;   // The line giving error

字符串

错误:

"C:\Users\tkumar\Documents\LDRA\LDRAunit_C_CPP_9.7.1\trial\inszt_algctivationgateway.cpp", 
line 4330: error #95: the size of an array must be greater than zero"

**引用:**uint32_t定义如下:

typedef unsigned long uint32_t;


我对无符号长尺寸有疑问,有人能解释一下这个错误背后的原因吗?

jvidinwx

jvidinwx1#

C2000架构上的最小可寻址单元(即“char”)是16位。
现在这有点不寻常,但它是允许的。C允许各种有趣的CPU架构,过去和未来实际上并不要求“char”是8位。“Char”可以是9,10,11,甚至16位,就像C2000上一样。
对于C2000 C编译器,sizeof(char)= 1,char是16位。
如果有帮助的话,你可以把C2000想象成有16位字节。所以一个32位的值是这些大字节中的两个。这确实使在C2000上使用第三方C库有点棘手,因为大多数人认为uint8_t是可用的。
我见过一些库typedef一个uint8_t,实际上是一个uint16_t,但这只是隐藏了问题。请避免这样。那些假的“uint8_t”可以有超过255的值,这对假设它会绕回的代码来说是个坏消息!
这里有一个很棒的文章(不是我的):https://faehnri.ch/byte-not-8-bits/

vhipe2zx

vhipe2zx2#

1)Code-Composer编译器以COFF或EABI的格式输出对象。当选择COFF时,对于某些微处理器,无符号长至少为40位。当选择EABI时,它为32位。2)对于某些TI微处理器,如C2000系列,最小可寻址字为16位,对于32位类型,sizeof将输出2而不是4。3)其中一个可能会导致sizeof语句返回4以外的值,导致?:所以数组的大小小于0。4)不要认为你真的想要一个数组在typedef之后。

sxissh06

sxissh063#

这里真实的混乱是charbyte的定义和用法,无论是在ISO 9899标准(这使得它们可以互换,提到大小)还是供应商(TI)文档中。
在文档“TMS 320 C28 x C/ C++ 实现”中,这种可怕的混乱被礼貌地描述如下:

TMS 320 C28 x字节为16位

根据ANSI/ISO C定义,sizeof运算符产生存储对象所需的字节数。ANSI/ISO进一步规定,当sizeof应用于char时,结果为1。由于TMS 320 C28 x char为16位(为了使其可单独寻址),一个字节也是16位。例如,size of(int)= = 1(而不是2)。TMS 320 C28 x字节和字是等效的(16位)。要以8位为增量访问数据,请使用第7.5.6节中描述的__byte()和__mov_byte()内部函数。
事实上,一个字节不是由固定数量的比特组成的:可以随意定义 *,大约在1 to 48 bits附近。
据我所知,这在过去很久就有了根源,即使我们今天用它来表达一个我们认为是固定的单位,也没有什么改变。甚至ISO/IEC 80000-13也来得太晚了,定义了8位的 * 他们的 * 字节。

相关问题