我从来没有真正理解为什么C++需要一个单独的头文件,其功能与.cpp文件相同.它使创建类和重构它们变得非常困难,并且它为项目添加了不必要的文件.然后是必须包含头文件的问题,但必须明确检查它是否已被包含.
C++于1998年获得批准,那为什么这样设计呢?单独的头文件有哪些优点?
当我包含的所有内容都是.h文件时,编译器如何找到带有代码的.cpp文件?是否假设.cpp文件与.h文件具有相同的名称,或者它是否实际查看目录树中的所有文件?
我是一名试图学习C++的JAVA开发人员,但我真的不知道标准函数声明的最佳实践是什么.
在课堂里:
class Clazz
{
public:
void Fun1()
{
//do something
}
}
Run Code Online (Sandbox Code Playgroud)
或者在外面:
class Clazz
{
public:
void Fun1();
}
Clazz::Fun1(){
// Do something
}
Run Code Online (Sandbox Code Playgroud)
我觉得第二个可读性较差......
我碰巧在.obj错误中已经定义了.这是我项目的结构:
#include "main.h";
Run Code Online (Sandbox Code Playgroud)
#include <iostream>
#include <string>
#include <sstream>
#include <boost/asio.hpp>
#include <boost/thread/thread.hpp>
#include "client.cpp"
Run Code Online (Sandbox Code Playgroud)
#ifndef SOCKET_CLIENT_CLASS
#define SOCKET_CLIENT_CLASS
#ifndef BOOST_ASIO_HPP
#include <boost/asio.hpp>
#endif
/*CLASS DEFINITION HERE*/
#endif
Run Code Online (Sandbox Code Playgroud)
这就是编译器抱怨的:
main.obj:错误LNK2005:"public:bool __thiscall SocketClient :: read(int,char*)"(?读取@SocketClient @@ QAE_NHPAD @ Z)已在client.obj中定义
注意它是在抱怨我的课,而不是提升.一个有趣的事情是,当我#include <boost/asio.hpp>从client.cpp中删除时,我会收到错误,因为它也包含在main.h中.
正如你所看到的,我不是双重定义/包括我的类,它只包含在main.h中一次.那么这里发生了什么?
我已经阅读了这个答案,但没有任何帮助,因为它预计会有双重包含.投票支持复制之前,请将此事实纳入考虑范围,因为这只是意味着无端地斩首我.
C中存在头文件的唯一原因是开发人员可以快速查看可用的函数,以及它们可以采用哪些参数?或者它与编译器有关?
为什么没有其他语言使用此方法?它只是我,还是看起来有两套功能定义只会导致更多的维护和更多的错误空间?或者知道头文件只是每个C开发人员必须知道的东西?
可能重复:
在C++中为什么有头文件和cpp文件?
由于两个相互矛盾的原因,我不太了解C++头文件:
我认为头文件的目的通常是分离接口和实现.换句话说,客户端使用头文件来学习如何使用该类,但不必担心类如何在内部实际实现此功能.
那么,为什么它是头文件中指定的C++类的私有变量?
在我看来,在头文件中使用私有变量违反了接口和实现的分离.直觉上,我认为私有变量在源文件中更有意义,因为这是不暴露给外部世界的文件.
也许我只是误解了头文件的目的,而且1.上面只是完全错误?以什么方式?
我习惯于编写没有模块的代码,其中头文件包含函数声明,如:
// foo.h
class Foo
{
void bar();
};
Run Code Online (Sandbox Code Playgroud)
并且相应的.cpp文件包含以下定义:
// foo.cpp
#include "foo.h"
void Foo::bar()
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
据我所知,这样做是为了减少编译时间并减少依赖性.当使用模块时,这仍然适用吗?将类放在单个文件中的定义与Java和C#的定义方式一样快吗?如果是这种情况,使用模块时是否需要.hpp和.cpp文件?
我有一个C/C++问题,我可以在不同的目标文件或项目中重用函数而无需编写两次函数头吗?(一个用于定义函数,另一个用于声明函数)
我不太了解C/C++,Delphi和D.我假设在Delphi或D中,你只需编写一个函数所需的参数,然后就可以在不同的项目中使用该函数.在C中,你需要在头文件中再次使用函数声明*,对吧?有没有一个好的工具可以从C源创建头文件?我有一个,但它不是预处理器意识而且不是很严格.我有一些非常糟糕的宏观技术.
我正在寻找用C/C++编程的方法,如http://www.digitalmars.com/d/1.0/pretod.html所述
基于对这个问题的回答:为什么C++有头文件和CPP
我已经看到了回答并理解了答案 - 那么为什么没有这样做呢?C#Java?
今天我在尝试使用IRremote库时遇到了一个奇怪的问题,我设法解决了以下问题.如果你在库中有一个文件夹,包含Foo.h和Foo.cpp在里面,并写一个草图来包含Foo.h:
#ifndef Foo_H
#define Foo_H
int AAA() {
return 0;
}
#endif
Run Code Online (Sandbox Code Playgroud)
#include "Foo.h"
Run Code Online (Sandbox Code Playgroud)
#include <Foo.h>
void setup(){
}
void loop(){
}
Run Code Online (Sandbox Code Playgroud)
错误消息是:
Foo\Foo.cpp.o: In function `AAA()':
E:\workShop\Arduino\libraries\Foo\/Foo.h:5: multiple definition of `AAA()'
includeTest.cpp.o:E:\workShop\Arduino\libraries\Foo/Foo.h:5:
first defined here
Run Code Online (Sandbox Code Playgroud)
我正在使用Windows 7 32位机器.在Arduino 1.0.5,1.0.4和21,22上测试.
因此,通过一些研究,我发现问题来自于我对预处理器和链接的混淆.这个问题解释了预处理器如何包含文件和包含防护:
以下是帮助我理解链接的一些页面:
这是对内联说明符的更好解释: