• 2
  • 新人请关照

可能是因为C++头文件相互包含导致的标识符未声明问题。

Cpp的语法没学到家,代码很简单
A.h

#pragma once
#include"B.h"

struct A {
    double v;
    B* bp;
};

typedef struct A A;

B.h

#pragma once
#include"A.h"

class B {
public:
    double b;
    B() { b = 0; }
    virtual bool f(const A& a) const = 0;
};

class BB :public B {
    virtual bool f(const A& a) {
        b = a.v;
        return true;
    }
};

报错如下:
image.png

阅读 102
评论
    1 个回答
    • 11.1k

    #pragma once是编译器相关的,有的编译器支持,有的编译器不支持,具体情况请查看编译器API文档,不过大部分编译器都有这个预处理指令了。

    #ifndef,#define,#endif是C/C++语言中的宏定义,通过宏定义避免文件多次编译。所以在所有支持C++语言的编译器上都是有效的,如果写的程序要跨平台,最好使用这种方式。

    #ifndef __A_H__
    #define __A_H__
    
    class B; //这里声明一下就可以了,不要循环引用。
    
    struct A {
        double v;
        B* bp;
    };
    
    typedef struct A A;
    
    #endif
    #ifndef __B_H__
    #define __B_H__
    #include"A.h"
    
    class B {
    public:
        double b;
        B() { b = 0; }
        virtual bool f(const A& a) const = 0;
    };
    
    class BB :public B {
        virtual bool f(const A& a) {
            b = a.v;
            return true;
        }
    };
    #endif