c++中未定义结构指针名称的typdef是如何工作的

How does typdef of an undefined struct pointer name work in C++?

本文关键字:何工作 工作 typdef 结构 未定义 指针 c++      更新时间:2023-10-16

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

我有以下两个文件。

猫a.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;
        }   
    };
猫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;"

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

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

谢谢。

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

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

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