下图是 TI 的官方例子:
![]() | 1 424778940 2022-08-14 23:46:34 +08:00 ![]() 嵌入式厂商的工具链未必完全遵循标准或者使用标准库 这种大概是库里有个 typedef 之类的或者编译器有特殊处理 |
2 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 |
![]() | 3 taotian OP @cnbatch 嗯是的,刚把 CCS 的头文件路径添加好之后,点进去它就能解析到那个头文件里的 typedef 了。谢谢! |
![]() | 4 taotian OP @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 也改了。 |
![]() | 5 thedrwu 2022-08-15 04:07:16 +08:00 via Android 不同的编译器、选项、机器、等等,int/short/long/word 之类的不一定一样。这么重新定义一下,必要时只需调整头文件的 typedef 就能集成,不需要去调编译器选项。 Void 估计是为了一家人齐齐整整 |
7 duke807 2022-08-15 09:22:19 +08:00 via Android ti 的模器件不,但是 dsp 、牙等 soc 的硬件真的心 譬如它的 dsp 的 char 是 2 bytes 大小,有 1 byte 型,各代都不兼容,要修改 |
8 duke807 2022-08-15 09:23:43 +08:00 via Android 想移植性高,完全可以用面的 uint8_t int32_t 的定 |
9 duke807 2022-08-15 09:25:17 +08:00 via Android 之所以不用,也可能是它的 dsp 不支持 int8_t uint8_t 型吧 |
![]() | 10 424778940 2022-08-15 11:50:17 +08:00 @taotian 具体为什么估计只有 TI 才知道了 但我估计就跟我现在一般都用 stdint.h 里的类型一样 因为 uint8_t 之类的长度不会根据架构不同而发生变化 int 这种根据平台不同有时候长度不一样 如果长度发生变化嵌入式里常用的按位运算就可能会出问题因为位数变了 这类东西都属于厂商常规操作 去研究具体为什么感觉意义不大 |
11 littlewing 2022-08-15 11:58:06 +08:00 #define true false #define false true |
![]() | 12 newmlp 2022-08-15 12:00:21 +08:00 你不知道有种东西叫 typedef 吗,还有种东西叫#define 吗 |
![]() | 13 424778940 2022-08-15 12:23:19 +08:00 @littlewing 别提了 以前我记得用哪个版本的 windows.h 里面有一句"#define ERROR 0" 这个导致了一大把奇怪错误都没地方查 后来找到我真是想谢谢他八辈祖宗 |
![]() | 14 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 。 |