RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 630732
Accepted
AleksBak
AleksBak
Asked:2020-02-21 18:44:37 +0000 UTC2020-02-21 18:44:37 +0000 UTC 2020-02-21 18:44:37 +0000 UTC

为什么要声明一个具有相同类型的 typedef

  • 772

可能是一些 C 技巧。喜欢他们的课。看起来广告已经在那里了。也许这就是为什么?例如,这是一行(来自 OpenCV):

typedef struct CvFileStorage    CvFileStorage;

为什么要这样写?我没有立即找到任何方法来解决这个问题。曾经(几年前),我记得读过它。当时纯 C 可能很流行,但现在已经忘记了。我在 Windows CE6 和其他人的代码中也看到了类似的东西。我记得它:),但我不记得为什么我需要它。如果有任何额外的 应该带段代码,然后告诉我。此行位于在其字段中某处使用来自此 typedef 的类型的结构之前。但为什么要这样写而不只是声明呢?谢谢你。

c
  • 3 3 个回答
  • 10 Views

3 个回答

  • Voted
  1. KoVadim
    2020-02-21T18:50:55Z2020-02-21T18:50:55Z

    在C++中,如果要声明一个struct类型的变量,只需要写上类型名和变量即可。在纯 C 中,情况并非如此。而且你应该总是写结构。这都是因为结构的类型和其他类型,可以说,在不同的范围内。但是既然程序员是懒惰的生物,还是写一个名字比较好

    typedef struct CvFileStorage    CvFileStorage;
    

    然后不要考虑为什么它不能编译(因为他们忘记了结构)或者为什么它以一种奇怪的方式工作(因为他们忘记了结构,并且有人声明了他们的类型,而不是同名的结构)。

    但他们往往写得更有趣:

    typedef struct {
    
    // тут объявление структры
    } struct_name;
    

    在这种情况下,一切都以与普通 C++ 中通常相同的方式立即创建。

    • 13
  2. Harry
    2020-02-21T18:48:23Z2020-02-21T18:48:23Z

    如果没有这个typedef,任何提及的结构都CvFileStorage必须完整地写出来:

    struct CvFileStorage  cv;
    void func(struct CvFileStorage* cv);
    

    等等。如果有声明,这个typedef词struct可以扔掉:

    CvFileStorage  cv;
    void func(CvFileStorage* cv);
    
    • 12
  3. Best Answer
    Vlad from Moscow
    2020-02-21T19:12:19Z2020-02-21T19:12:19Z

    声明此 typedef 至少有两个充分的理由。

    typedef struct CvFileStorage    CvFileStorage;
    

    第一个原因是在 C 程序中,您必须将关键字structor放在enum结构或枚举的名称之前。输入代码时看起来很繁琐。很多时候,程序员会忘记指定这些词,从而导致编译错误。因此,typedef通过允许程序员不在结构或枚举的名称之前写这些关键字,这让程序员的生活更轻松。

    第二个原因是结构名称和其他标识符在不同的名称空间中。因此,可以使用相同的名称来声明一个结构和一个普通变量。例如下面的代码片段是正确的

    struct CvFileStorage
    {
        //...
    };
    
    
    int CvFileStorage;
    

    此代码片段声明了一个具有相同名称的结构CvFileStorage和一个具有相同名称的类型变量int。这些声明彼此不冲突,因为正如已经写过的那样,结构名称必须以关键字开头struct。

    例如,您可以在 C 中编写

    struct CvFileStorage
    {
        int CvFileStorage;
    } CvFileStorage;
    

    这个声明是正确的,因为三个匹配的标识符在不同的命名空间中。

    然而,这可能会误导代码的读者,因为如果程序员错误地省略了struct结构名称前的关键字,那么从语言语法的角度来看,代码可能仍然是正确的,虽然结构实际上是指,而不是同名变量。

    例如,在这个表达式中,程序员无意中忘记了指定关键字struct,但仍然收到了正确的表达式,因为有一个同名变量

    sizeof( CvFileStorage )
    

    为避免此类混淆,建议在保留此名称时不要struct 为结构名称添加关键字,使用typedef..

    struct在 C++ 中,引用结构时可以省略关键字。那么问题来了:在 C 中你可以声明一个与结构名称同名的变量或函数呢?

    此问题通过以下方式解决:变量名或函数名隐藏同名结构的声明。因此,在引用结构时,必须指定限定名。

    例如,

    struct CvFileStorage
    {
        //...
    };
    
    void CvFileStorage();
    

    在此代码片段中,函数声明隐藏了同名的结构声明。因此,例如,如果要声明此结构的对象,则需要指定结构的限定名称。

    struct CvFileStorage obj;
    

    或者,例如,您可以编写这样的声明

    struct CvFileStorage
    {
        //...
    };
    
    void CvFileStorage( struct CvFileStorage );
    

    这些名称不会相互冲突,因为限定名称用于结构。

    • 9

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5