V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
taotian
V2EX  ›  C

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

  •  
  •   taotian · 2022-08-14 23:12:33 +08:00 · 3686 次点击
    这是一个创建于 861 天前的主题,其中的信息可能已经有所发展或是发生改变。

    下图是 TI 的官方例子:

    14 条回复    2022-08-15 19:29:37 +08:00
    424778940
        1
    424778940  
       2022-08-14 23:46:34 +08:00   ❤️ 2
    嵌入式厂商的工具链未必完全遵循标准或者使用标准库
    这种大概是库里有个 typedef 之类的或者编译器有特殊处理
    cnbatch
        2
    cnbatch  
       2022-08-15 00:16:42 +08:00   ❤️ 1
    看到“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
        3
    taotian  
    OP
       2022-08-15 00:46:37 +08:00
    @cnbatch 嗯是的,刚把 CCS 的头文件路径添加好之后,点进去它就能解析到那个头文件里的 typedef 了。谢谢!
    taotian
        4
    taotian  
    OP
       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
        5
    thedrwu  
       2022-08-15 04:07:16 +08:00 via Android
    不同的编译器、选项、机器、等等,int/short/long/word 之类的不一定一样。这么重新定义一下,必要时只需调整头文件的 typedef 就能集成,不需要去调编译器选项。

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

    譬如它的 dsp 的 char 是 2 bytes 大小,沒有 1 byte 數據類型,各種代碼都不兼容,要專門修改
    duke807
        8
    duke807  
       2022-08-15 09:23:43 +08:00 via Android
    想移植性高,完全可以用標準庫裡面的 uint8_t int32_t 這樣的定義
    duke807
        9
    duke807  
       2022-08-15 09:25:17 +08:00 via Android
    之所以不用,也可能是它的 dsp 不支持 int8_t uint8_t 數據類型吧
    424778940
        10
    424778940  
       2022-08-15 11:50:17 +08:00
    @taotian 具体为什么估计只有 TI 才知道了 但我估计就跟我现在一般都用 stdint.h 里的类型一样 因为 uint8_t 之类的长度不会根据架构不同而发生变化 int 这种根据平台不同有时候长度不一样 如果长度发生变化嵌入式里常用的按位运算就可能会出问题因为位数变了
    这类东西都属于厂商常规操作 去研究具体为什么感觉意义不大
    littlewing
        11
    littlewing  
       2022-08-15 11:58:06 +08:00
    #define true false
    #define false true
    newmlp
        12
    newmlp  
       2022-08-15 12:00:21 +08:00
    你不知道有种东西叫 typedef 吗,还有种东西叫#define 吗
    424778940
        13
    424778940  
       2022-08-15 12:23:19 +08:00
    @littlewing 别提了 以前我记得用哪个版本的 windows.h 里面有一句"#define ERROR 0" 这个导致了一大把奇怪错误都没地方查 后来找到我真是想谢谢他八辈祖宗
    FrankHB
        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 。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1056 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 23:25 · PVG 07:25 · LAX 15:25 · JFK 18:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.