【问题标题】:How does typdef of an undefined struct pointer name work in C++?未定义的结构指针名称的 typdef 如何在 C++ 中工作?
【发布时间】:2016-11-16 15:22:19
【问题描述】:

让我借助代码解释一下这个问题。

我有以下两个文件。

猫啊.h

    typedef struct myIterStruct*   myIter;

    class myIterator;

    class myList
    {
        int mVal;
        myList* mNext;
        friend class myIterator;

        public:

        myList(myList* next, int val) : mVal(val), mNext(next) {}

        ~myList() {}

        void AddTail(int val) {
            myList* newnode = new myList(NULL, val);
            myList* tail = this->GetTail();
            tail->mNext = newnode;
        }   

        myList* GetTail() {
            myList* node = this;
            while (node->mNext)
                node = node->mNext;
            return node;
        }   

        myList* GetNext() { return mNext; }

        int GetVal() { return mVal; }
    };

    class myIterator
    {
        myList*   mList;

        public:

        myIterator(myList* list) : mList(list) {}
        ~myIterator() {}

        int next() {
            int ret = -1; 
            if (mList) {
                ret = mList->GetVal();
                mList = mList->GetNext();
            }
            return ret;
        }   
    };

cat main.cxx

#include <iostream>
#include "a.h"
using namespace std;

myIter createIterator(myList* list)
{
    myIterator *returnitr = new myIterator(list);
    return (myIter) returnitr;
}

int myListGetNextNode(myIter iter)
{
    if (iter == NULL)
        return -1; 
    myIterator* funciter = (myIterator *) iter;
    return funciter->next();
}

int main() 
{

    myList* list = new myList(NULL, 1); 
    list->AddTail(2);
    list->AddTail(3);

    myIter iter = createIterator(list);
    int val = -1; 

    while((val = myListGetNextNode(iter)) != -1) {
        cout << val << '\t';
    }   
    cout << endl;

    return 0;
}

此代码在项目中用于实现列表和迭代器。 我无法理解的是 a.h 文件中的第一行:“typedef struct myIterStruct *myIter;”

在代码中,struct myIterStruct 的定义没有写在任何地方,但这段代码仍然可以编译并且运行良好。

C++ 编译器是否将未定义的结构指针转换为 void*?或者这是否特定于我正在使用的 g++ 编译器? 请详细说明。

谢谢。

【问题讨论】:

  • 你转发声明结构。当您将 typedef 更改为此 typedef myIterStruct *myIter; 时,它应该会更改

标签: c++ pointers struct g++ typedef


【解决方案1】:

知道myIterStruct 是一个类或结构就足够了。当编译器看到struct myIterStruct 时,它知道这一点并可以形成一个指向它的指针。

这必须起作用的规则间接强制编译器对所有指向类/结构的指针使用相同的大小。

其他一些指针,尤其是void*char*,可能会在一些不寻常的系统上使用额外的字节。

【讨论】:

  • 我无法想象有sizeof(char*) != sizeof(RandomType*) 的平台。你有例子吗?
  • 非常感谢博!!
  • @SergeyA - 我们曾经有单词寻址机器,其中每个单词包含几个字符。除了单词地址之外,char* 可能还需要一个索引。
  • @BoPersson,但指向每个对象的指针都可以表示为 char*。在这种情况下,这些索引从哪里来?
  • @SergeyA - 这取决于实施者。只是允许针对不同类型的指针有不同的大小,参见quote from the C standard
猜你喜欢
  • 2010-10-05
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
  • 2014-04-02
  • 2023-03-18
  • 2016-10-19
  • 2020-12-09
  • 1970-01-01
相关资源
最近更新 更多