c/c++语言开发共享C中是否需要typedef?

Typedef对于可移植名称,标记名称( typedef struct foo Foo; )以及保持复杂(函数)声明可读( typedef int (*cmpfunc)(const void *, const void *); )非常有用。

但是在C中是否存在真正需要typedef的情况? 通过简单地写出派生类型,你无法做到这一点。

澄清一点:我的意思是语言用户,而不是实施者。 整个stdint.h是第二类的一个很好的例子。

结论

感谢您的输入。 我想我可以总结为:

    根据定义, typedef是别名。 因此,您始终可以使用实际类型替换别名。 否则它不会是别名。

    这并不意味着避免使用typedef会是一个好主意。

    谢谢大家的回答。 我自己看了一些,在C99中发现了这个,J.2未定义的行为:

    在以下情况下,行为未定:[…]

    因此,当您想要将复杂的派生类型传递/提取到va_arg例如int (*)[]您需要将此类型的类型设置为可能的(更新/更正):

     typedef int (*intarrptr)[4]; intarrptr x = va_arg(ap, intarrptr); 

    由于很难找到这个实际有用的案例,因此可以得出结论,对于typedef的必要性,它并不是一个强有力的论据。

    来自维基百科:

    typedef是C和C ++编程语言中的关键字。 typedef的目的是为现有类型指定替代名称,通常是那些标准声明繁琐,可能令人困惑或可能因实现而异的那些。 1

    根据这个定义,不会永远不需要它,因为你总是可以写出扩展的forms。 但是,可能存在宏定义,其选择基于平台或其他类型使用的typedef。 因此,始终使用扩展forms可能不是非常便携。

    这绝对是必需的,一个很好的例子是size_t,它在各种平台上都是typedef。

    在检查C编译器是否符合ISO-C的测试套件中肯定需要关键字typedef。

    在未明确应该使用typedef的代码中(如上面的测试套件),它通常非常有用,但从不必要,因为它只建立了另一种类型的别名。 它不会创建类型。

    最后,我不会通过缩写typedef可以提供的数据来避免编译器对预处理源文件大小的限制。

    是。 必须是固定大小的整数类型。 例如int32_t (并且您希望您的代码具有可移植性的机会)。

    offsetof()宏需要structnamemembername ,因此不能与内联结构定义一起使用。 好吧,也许你的实现可以,但C标准不保证。

    更新:正如评论中所指出的,这是可能的:

     struct blah { int a; int b; }; x = offsetof(struct blah, a); // legal 

    但是内联结构定义不是:

     x = offsetof(struct {int a; int b;}, a); // illegal 

    前者不包含关键字typedef ,但也无法内联结构定义。 “简单写出派生类型”表示哪个版本尚不清楚。

    没有。

    typedef不像C ++中的类那样创建一个真正的新类型,它只是创建一个类型别名 – 一个已经存在的其他东西的单一标识符。 在typedef中,您不定义任何新行为,语义,转换或操作符。

    不,我认为我这么说是安全的!

    我知道在C中没有明确需要typedef的情况。

    不是“非常有用”意味着要求吗?

    我甚至很难想到每个结构成员,指针,争论等的结构项目。

    对我来说,typedef提供了抽象。 它使我的代码保持干净,非常容易理解。 你可以在没有typedef的情况下生活,就像没有所有高级语言并坚持使用汇编语言或机器语言一样。

    个别程序员不需要创建自己的typedef。 没有普遍的规则说我不能写像

     int *(*(*x())[5])(); 

    如果我愿意的话(虽然我公司的编码标准可能会不屑一顾)。

    它们遍布标准库,但是( FILEsize_t等),所以你真的无法避免使用typedef名称。

    我们使用typedef来保持代码平台的独立性。 例如,我们做类似的事情

     typedef unsigned char SHORT; 

    这使代码更易读,易于移植。

    如果没有typedef,如果在声明中使用struct,则必须每次都使用关键字struct。 使用typedef,您可以省略它。

    需要了解更多c/c++开发分享C中是否需要typedef?,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!

     struct Person { char * name; }; struct Person p; /* need this here*/ typedef struct _Person { char * name; } Person; Person p; /* with typedef I can omit struct keyword here */ 

      以上就是c/c++开发分享C中是否需要typedef?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/979576.html

      (0)
      上一篇 2021年12月13日
      下一篇 2021年12月13日

      精彩推荐