C 语言中基础数据类型首字母大写了,如 `Int`, `String`,但是编译能通过,这是怎么回事呀?

2022-08-14 23:12:33 +08:00
 taotian

下图是 TI 的官方例子:

3691 次点击
所在节点    C
14 条回复
424778940
2022-08-14 23:46:34 +08:00
嵌入式厂商的工具链未必完全遵循标准或者使用标准库
这种大概是库里有个 typedef 之类的或者编译器有特殊处理
cnbatch
2022-08-15 00:16:42 +08:00
看到“String”的时候我就有疑惑,我记得 C 语言并不自带“string”类型(无论大小写),“string”也不是关键字。
https://en.cppreference.com/w/c/keyword

于是就用这些代码出现过的一些关键词去找资料( Main_parseArgs 和 Main_USAGE ),看到了类似的代码:
https://stash.phytec.com/projects/MIRROR/repos/ipc-ipcdev/browse/linux/src/tests/Msgq100.c

再继续找它们的头文件,终于找到了源头:
https://stash.phytec.com/projects/MIRROR/repos/ipc-ipcdev/browse/linux/include/ti/ipc/Std.h

没错,就是来自于#include <ti/ipc/Std.h>里面的 typedef
taotian
2022-08-15 00:46:37 +08:00
@cnbatch 嗯是的,刚把 CCS 的头文件路径添加好之后,点进去它就能解析到那个头文件里的 typedef 了。谢谢!
taotian
2022-08-15 00:51:43 +08:00
@424778940 是这样,不过比较好奇这样做的目的是什么呢,实际上头文件里面是这样的

```c
typedef char Char;
typedef unsigned char UChar;
typedef unsigned short UShort;
typedef int Int;
typedef unsigned int UInt;
typedef long Long;
typedef unsigned long ULong;
#define Void void
```

我能想到的好处是 unsigned long 这些会简短些,为了保持风格的统一就把 int 也改了。
thedrwu
2022-08-15 04:07:16 +08:00
不同的编译器、选项、机器、等等,int/short/long/word 之类的不一定一样。这么重新定义一下,必要时只需调整头文件的 typedef 就能集成,不需要去调编译器选项。

Void 估计是为了一家人齐齐整整
yolee599
2022-08-15 08:08:34 +08:00
@taotian 因为这样可移植性高,移植到另一个平台只需要修改一个头文件就可以了
duke807
2022-08-15 09:22:19 +08:00
ti 的模擬器件不錯,但是 dsp 、藍牙等 soc 的軟硬件真的噁心

譬如它的 dsp 的 char 是 2 bytes 大小,沒有 1 byte 數據類型,各種代碼都不兼容,要專門修改
duke807
2022-08-15 09:23:43 +08:00
想移植性高,完全可以用標準庫裡面的 uint8_t int32_t 這樣的定義
duke807
2022-08-15 09:25:17 +08:00
之所以不用,也可能是它的 dsp 不支持 int8_t uint8_t 數據類型吧
424778940
2022-08-15 11:50:17 +08:00
@taotian 具体为什么估计只有 TI 才知道了 但我估计就跟我现在一般都用 stdint.h 里的类型一样 因为 uint8_t 之类的长度不会根据架构不同而发生变化 int 这种根据平台不同有时候长度不一样 如果长度发生变化嵌入式里常用的按位运算就可能会出问题因为位数变了
这类东西都属于厂商常规操作 去研究具体为什么感觉意义不大
littlewing
2022-08-15 11:58:06 +08:00
#define true false
#define false true
newmlp
2022-08-15 12:00:21 +08:00
你不知道有种东西叫 typedef 吗,还有种东西叫#define 吗
424778940
2022-08-15 12:23:19 +08:00
@littlewing 别提了 以前我记得用哪个版本的 windows.h 里面有一句"#define ERROR 0" 这个导致了一大把奇怪错误都没地方查 后来找到我真是想谢谢他八辈祖宗
FrankHB
2022-08-15 19:29:37 +08:00
@taotian 除了 unsigned char 之类的缩写还能算是偷点懒,大概是其它语言用多了的典型自作多情。

像 Win32 SDK 里一坨 typedef void VOID; 一样一股早年 BASIC/PASCAL 糊傻了的瘆人味儿。还有 BOOL 这种笑话……当然这里的 #define 就更加神来一笔了。

表面上看是统一代码风格,实际上就是进一步用非标准方言分裂用户习惯。又去不掉原来被 typedef 掉的关键字,用户用了还能拒绝编译过?结果就是更加混乱。

正常点的做法就是 POSIX 这种,扩展现有语言标准,那么就不要重复已有的废话。当然这样有个后遗症就是不可能指望统一什么鸟 PascalCase ,但就算不这样也本来不能指望(没几个环境能彻底干掉小写的关键字)——作为 C ( C 艹同理)用户必须熟练见人说人话见鬼说鬼话,能做到通过标识符风格区分来源。

唯一一个例外是语言标准明确钦定特殊地位的保留标识符,不过这个就不是打算给你用户使用的。不过 C23 也干掉 _ 开头的东西了。(讲个笑话,bool 终于要是关键字了……)

@duke807 符合 ISO C 的 char 必然是 1 字节。C 允许 1 字节不小于 8 位。

@424778940 不存在 8 位的 unsigned integer type ,就不要求提供 uint8_t 。反正有 uint8_least_t 。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/872834

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX