c++中包含错误的文件

Wrong files include in c++

本文关键字:文件 错误 包含 c++      更新时间:2023-10-16

我在c++中包含文件时遇到了一些问题。

记录.hpp

#ifndef record_hpp
#define record_hpp
#include <stdio.h>
class record {
......
};
#endif /* record_hpp */

节点.hpp

#ifndef node_hpp
#define node_hpp
#include <stdio.h>
#include <string.h>
#include "record.hpp"

class recordNode: public record {
...... };
#endif /* node_hpp */

List.hpp

#ifndef List_hpp
#define List_hpp

#include <stdio.h>
#include "node.hpp"
class List
{.........};
#endif /* List_hpp */

节点2.hpp

#ifndef node_hpp
#define node_hpp
#include "List.hpp"
#include "node.hpp"
#include <stdio.h>
#define N 5

class node {
private:
    List **key;
public:
    recordNode *k;
};

在最后一个文件中,我遇到了很多问题。编译器不知道List结构和recordNode是什么。我不知道如何修复它。

节点.hpp中,您在顶部定义了以下内容:

#ifndef node_hpp
#define node_hpp

node2.hpp中,您还在顶部定义了以下内容:

#ifndef node_hpp
#define node_hpp

我建议将node2.hpp更改为

#ifndef node2_hpp
#define node2_hpp

或类似的东西,并添加

#endif /* node2_hpp */

到文件末尾。

这个东西

#ifndef record_hpp
#define record_hpp

#endif /* record_hpp */

称为Include Guard。它可以防止所包含的文件被重复包含,并可能在你可怜的毫无戒心的程序上释放递归地狱和重复定义。

考虑一下像string这样的东西,它几乎包含在所有内容中。如果没有防护,std::string可能会被定义数百次。这至少会减慢编译速度。在最坏的情况下,真的很奇怪的事情会发生,你会花上几个小时或几天的时间进行调试。

逻辑如下:

如果我们没有看到record_hpp(#ifndef record_hpp),请将其标记为已看到(#define record_hpp),并将文件中的所有内容复制到包含文件中,直到保护(#endif /* record_hpp */)结束

在node.hpp中,该保护被称为node_hpp。node2.hpp中使用了相同的名称,因此

#ifndef node_hpp
#define node_hpp
#include "List.hpp"
#include "node.hpp"
#include <stdio.h>
#define N 5

class node {
private:
    List **key;
public:
    recordNode *k;
};

将扩展到

#ifndef node_hpp
#define node_hpp
#include "List.hpp"
#ifndef node_hpp
#define node_hpp
#include <stdio.h>
#include <string.h>
#include "record.hpp"

class recordNode: public record {
...... };
#endif /* node_hpp */
#include <stdio.h>
#define N 5

class node {
private:
    List **key;
public:
    recordNode *k;
};

因为我们已经看到了node_hpp,所以node_hpp保护的第二个块将被忽略,node2.hpp将变成

#ifndef node_hpp
#define node_hpp
#include "List.hpp"
#ifndef node_hpp
#endif /* node_hpp */
#include <stdio.h>
#define N 5

class node {
private:
    List **key;
public:
    recordNode *k;
};

因此,recordNode从未被定义。哎呀。

外卖永远不会重复,包括警卫。

还要注意,在node2.hpp的末尾没有#endif来关闭include保护。这以后也会引起一些丑陋。

解决方案:

#ifndef node2_hpp
#define node2_hpp
#include "List.hpp"
#include "node.hpp"
#include <stdio.h>
#define N 5

class node {
private:
    List **key;
public:
    recordNode *k;
};
#endif /* node2_hpp */

更复杂的项目将需要更复杂的include-guard名称,因为很可能有两个"list.hpp",一个在代码中,另一个在第三方库中。