C++中两个标头顺序之间的差异似乎会产生错误

Difference between two header orderings in C++ seems to generate error

本文关键字:错误 之间 顺序 两个 C++      更新时间:2023-10-16

我有一个名为File的类,它(与其他类一起)在标头"dmanager1.h"中定义。在"dmanager1.cpp"文件(dmanager1.h文件的实现)中,当我按一个顺序列出标头时,我在尝试与main.cpp一起编译时会遇到错误(main.cpp为空,除了标头调用和空的"int main()"。。。基本上我只是在测试类.h和.cpp文件)。。。如果我在dmanager1.cpp文件中切换标题,我不会得到任何错误。我不明白发生了什么。我得到的错误是:错误:"文件"未命名类型

当我在"dmanager1.cpp"中对标题进行排序时,我得到了错误提示,如下所示:

#include "dmanager1.h"
#include <iostream>
#include <cstring>

如果我把标题切换到:

 #include <iostream>
 #include <cstring>
 #include "dmanager1.h"

我不明白编译错误。第一个订单被解析有趣吗?任何想法都将不胜感激。

编辑:添加了有问题的标题的一部分。。。

#ifndef _dmanager1_h
#define _dmanager1_h

//--------------------
// Forward References
//--------------------
// Node_L, Node_T, and Sector are defined in File: dmanager1a.h
class Node_L;
class Node_T;
class Sector;

class File
{
        public:
                // Default Constructor
                //File();
                // Constructor: Allowing "name", "size", and/or "permissions" to be set
                // Permissions set to default of 0 == read and write
                File(const char * & name, float size = 0, int permissions = 0) : timestamp(11223333) {};
                // Default Destructor
                ~File();
                //returns an int corresponding to the date modified (mmddyy)
                int get_date_mod(void) const {return timestamp;}
                // Return's current level of permission on the File: 0 = read/write, 1 = read only
                int get_permission(void) const {return permission;}
                // Set's Permission to "level": 0 = read/write, 1 = read only
                int set_permission(int level);
        private:
                // Data members
                char * name;
                float size_OA;
                //function used to update "date modified"
                void update_timestamp(void);
                // Current permission level of the file: 0 = read/write, 1 = read only
                int permission;
                //value modified by update_timestamp() and the value returned by get_date_mod().  Date file last edited.
                int timestamp;
};

很可能您的dmanager1.h标头需要iostreamcstring定义的内容。

因此,它无法正确解析,编译器也无法理解File类的声明。

如果你发布你的dmanager1.h文件,你将能够得到更详细的答案。

请确保每个标头都是完全自给自足的。它需要为它使用的所有内容#include标头,而不是假设它们将被其他内容包含。每个头都应该工作,即使它是.c文件中唯一包含的头。

我敢打赌,你的dmanager1.h头使用了标准库中的一些东西,而你没有包含它所需要的头。交换标头似乎可以解决问题,但这只是巧合。

您可以做的一个诊断测试是创建一个.c文件,该文件只包含#include "dmanager1.h"行。试着编译它。如果编译器抛出错误,它应该提供需要包括哪些附加头的提示。

更新:我可以使用您使用g++ -Wall发布的头的初始部分进行编译,并且我不会收到任何错误或警告。请张贴一个重现问题的样本。