Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ g++;标题包括:仍然不';找不到定义_C++_Include_Makefile_G++_Header Files - Fatal编程技术网

C++ g++;标题包括:仍然不';找不到定义

C++ g++;标题包括:仍然不';找不到定义,c++,include,makefile,g++,header-files,C++,Include,Makefile,G++,Header Files,晚上好:) 我正在玩g++和makefile。我已经说到这一点: foo.h: #ifndef _FOO_H_ #define _FOO_H_ #include "bar.h" class foo { private: bar something; public: bool start(); bool stop(); }; #endif // _FOO_H_ h最终包含在我的主cpp文件中,所以我可以通过调用start/stop来启动 void somewhere

晚上好:)

我正在玩g++和makefile。我已经说到这一点:

foo.h:

#ifndef _FOO_H_
#define _FOO_H_

#include "bar.h"

class foo {
private:
    bar something;
public:
    bool start();
    bool stop();
};

#endif // _FOO_H_
h最终包含在我的主cpp文件中,所以我可以通过调用start/stop来启动

void somewhere() {
    foo* hihi = new foo;
    hihi->start();
    delete hihi;
}
然后是酒吧。h:

#ifndef _BAR_H_
#define _BAR_H_

class bar {

};

#endif // _BAR_H_

然而,g++似乎不喜欢它:

g++  (some_flags) -c main.cpp
In file included from main.cpp:2:
foo.h:8: error: ‘bar’ does not name a type
我正在使用makefiles,并尝试了以下组合:

main.o: main.cpp foo.h bar.h
即使我不认为我应该在这里添加bar.h,但在foo.h中包含它就足够了吗

澄清一下,这大致就是现在的设置方式(是的,我知道这可以以更有效的方式完成):

发生什么事了?我想这是我在g++中缺少的东西,它处理头文件的方式包括,请给我指出正确的方向

编辑-找到解决方案:

啊!我现在觉得自己很笨。 我和boost::asio混在一起,有点忘了我仍然把它放在我的标题上的某个地方: 使用boost::asio::ip::tcp

假设有一个boost::asio::ip::tcp::bar函数:D


哦,不管怎样,谢谢你

在main.cpp中,需要在文件顶部添加以下行:

#include "foo.h"

在main.cpp中,需要在文件顶部添加以下行:

#include "foo.h"

仔细检查一切。如果在
foo.h
中包含
bar.h
,编译器不应引发错误。您是否将
bar.h
中的
foo.h
包括在内?最好不要这样做,因为这样会导致头之间的循环依赖关系,从而导致此类错误

还要检查页眉护板的拼写。这可能是一个常见的烦恼源:

#ifdef _BAR_H_ // OOPS! we wanted #ifndef
#define _BAR_H_

class bar {

};

#endif // _BAR_H_

此外,应避免将下划线放在标头保护宏名称之前。这些名称保留给编译器。称之为
INCLUDED\u BAR\u H
或干脆称之为
BAR\u H

仔细检查所有内容。如果在
foo.h
中包含
bar.h
,编译器不应引发错误。您是否将
bar.h
中的
foo.h
包括在内?最好不要这样做,因为这样会导致头之间的循环依赖关系,从而导致此类错误

还要检查页眉护板的拼写。这可能是一个常见的烦恼源:

#ifdef _BAR_H_ // OOPS! we wanted #ifndef
#define _BAR_H_

class bar {

};

#endif // _BAR_H_

此外,应避免将下划线放在标头保护宏名称之前。这些名称保留给编译器。称之为
INCLUDED\u BAR\u H
或干脆称之为
BAR\u H

Tommy Hui和litb已经指出了两个可能的原因;这里有一些背景信息,希望会有用

首先,这与makefile无关。makefile只是为您调用g++的方便工具,仅此而已

头文件的这些东西一开始可能有点难以理解,尤其是当您进入循环依赖时。它真的帮助我认识到这三件事:

  • #include
    只不过是一个复制/粘贴操作,在该点插入包含文件的内容
  • 所有东西在使用前都必须申报。有时,当出现循环依赖项时,您可能需要在另一个标头中预先声明一个类(例如
    类栏;
  • 如果在使用时需要更多关于类型的信息,而不仅仅是它的存在,那么也需要类型的定义。例如,这适用于对该类型的对象调用方法,但也适用于包含该类型的字段!(但不适用于指向该类型对象的指针,因为指针的大小都相同。)

许宇人和利特已经指出了两个可能的原因;这里有一些背景信息,希望会有用

首先,这与makefile无关。makefile只是为您调用g++的方便工具,仅此而已

头文件的这些东西一开始可能有点难以理解,尤其是当您进入循环依赖时。它真的帮助我认识到这三件事:

  • #include
    只不过是一个复制/粘贴操作,在该点插入包含文件的内容
  • 所有东西在使用前都必须申报。有时,当出现循环依赖项时,您可能需要在另一个标头中预先声明一个类(例如
    类栏;
  • 如果在使用时需要更多关于类型的信息,而不仅仅是它的存在,那么也需要类型的定义。例如,这适用于对该类型的对象调用方法,但也适用于包含该类型的字段!(但不适用于指向该类型对象的指针,因为指针的大小都相同。)
我在和boost::asio混在一起,有点忘了我仍然把它放在我的头上的某个地方:使用boost::asio::ip::tcp

假设有一个boost::asio::ip::tcp::bar函数

您应该键入定义类名的一些原因,尽管它可能看起来是多余的

好吧,你们已经遇到了现实生活中的情况,在这种情况下,类型定义一个类可能会帮助你们更容易发现你们的问题:

 class bar {
 // ...
 };
 typedef class bar bar;
如果已声明名为
bar()
的函数,则生成此更有意义的消息:

In file included from C:\temp\foo.h:4,
                 from C:\temp\test.cpp:4:
C:\temp\bar.h:7: error: `typedef class bar bar' redeclared as different kind of symbol
C:\temp\test.cpp:1: error: previous declaration of `void bar(int)'
C:\temp\bar.h:7: error: declaration of `typedef class bar bar'
我在和boost::asio混在一起,有点忘了我仍然把它放在我的头上的某个地方:使用boost::asio::ip::tcp

假设有一个boost::asio::ip::tcp::bar函数

您应该键入定义类名的一些原因,尽管它可能看起来是多余的

好吧,你们已经遇到了现实生活中的情况,在这种情况下,类型定义一个类可能会帮助你们更容易发现你们的问题:

 class bar {
 // ...
 };
 typedef class bar bar;
如果已声明名为
bar()
的函数,则生成此更有意义的消息:

In file included from C:\temp\foo.h:4,
                 from C:\temp\test.cpp:4:
C:\temp\bar.h:7: error: `typedef class bar bar' redeclared as different kind of symbol
C:\temp\test.cpp:1: error: previous declaration of `void bar(int)'
C:\temp\bar.h:7: error: declaration of `typedef class bar bar'
酒吧,h在