今天我在尝试使用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上测试.
因此,通过一些研究,我发现问题来自于我对预处理器和链接的混淆.这个问题解释了预处理器如何包含文件和包含防护:
以下是帮助我理解链接的一些页面:
这是对内联说明符的更好解释:
编辑:添加了“加法”类,不小心忘记了。如何将类分成不同的文件?我了解类的工作原理以及如何制作对象和类似的东西。但是,我在将类放入不同文件的过程中发现了一些混乱。非常感谢您的帮助!另外,我使用 CodeBlocks 作为 IDE。到目前为止,这是我的理解:
到目前为止,这是我的理解,但我只是对如何实现它感到困惑。我创建了一个简单的计算器,其中包含一个源文件中的所有类。它工作得很好,我想我为此感到非常自豪:) 我知道有很多更简单的方法来制作这样的东西,但我使用类和对象来代替练习的唯一目的。这是我的计算器代码。另外,我真的为这篇长篇文章道歉:/谢谢,如果你读了这么远,特别感谢你能帮我一点!
这是我在一个源文件中的代码:
#include <iostream>
using namespace std;
class Addition {
public:
float add (float x, float y) {
float sum;
sum=x+y;
return sum;
}
};
class Subtraction {
public:
float subtract (float x, float y) {
float dif;
dif=x-y;
return dif;
}
};
class Multiplication {
public:
float multiply (float x, float y) {
float prod;
prod=x*y;
return prod;
}
};
class Division {
public:
float divide (float x, …Run Code Online (Sandbox Code Playgroud) 我只是有一个简单的问题,因为我试图了解如何在 C++ 中编译(在 ubuntu 12.04 中)包含一个简单头文件的 main 。
命令:
g++ -o main main.cpp add.cpp -Wall
Run Code Online (Sandbox Code Playgroud)
工作正常。然而,这让我对头文件的意义感到困惑。目前,我有一个简单的程序:
#include <iostream>
#include "add.h"
using namespace std;
int main () {
int a, b;
cout << "Enter two numbers to add together" << endl;
cin >> a >> b;
cout << "Sum of " << a << " and " << b << " is " << add(a,b) << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的“add.cpp”只是将两个数字加在一起。
头文件只是函数原型的替换吗?我是否需要单独编译头文件,或者在命令行中包含所有 .cpp 文件就足够了吗?我知道如果我需要更多文件,则需要生成文件。
我有一个VECTOR结构,它包含3个整数,i,j和k.我需要在多个头文件中使用此结构.将所有#defines和结构,所有常量移动到标记为"Constants.h"的单独头文件,或者我应该在每个头文件中定义相同的结构(我当前使用它)被认为是不好的做法吗?
我是Java程序员,我是C++编程的新手.在java中,我们必须在单独的文件中编写所有类,并且所有方法的定义都在类中.但是现在在C++中,我想知道为什么C++允许程序员在类之外编写方法的定义.有没有办法编写像Java这样的C++程序?
有人在这里问了一个类似于我的问题: Function Declaration inside or outside of the class?
为什么只在.h文件中声明函数而不是定义,然后将整个定义写入.cpp文件中?重点是什么?为什么不把整个函数放在头文件中的一个类中,而不是仅仅声明它?这似乎是重复和毫无意义的。
如何构建程序以使用头文件和其他.cpp文件而不将函数、类和变量堆积到主文件中?我能得到一个使用.h文件和几个.cpp文件的简单程序的例子吗?
我理解并非常欣赏分离头文件(.h、.hpp)和源文件(.cpp)的做法。
然而,许多简单的类可以完全在头文件本身中表达。我可以在类中定义一些方法,在类下定义其他方法(例如模板方法、内联方法)。
当我可以在头文件中声明和定义整个类时,创建 .cpp 文件有什么好处?(我什至需要吗?)
在为当地一所大学的几名学生辅导之后,我被问到"与普通的.cpp文件相比,何时最好使用C++中的头文件?".我有点挣扎着答案,并且看看是否有一个更明确的答案,在哪些场景下最好的.
使用可在多个项目中使用的代码时最好使用头文件吗?我知道这是一个愚蠢的例子,但如果你做了自定义数学函数,可以在其他项目中反复使用; 那最好放在头文件中是否正确?
我已经编写了Objective C近一年了,我从来没有机会将Interface(.h)用于其他目的,而不是声明几乎与在Implementation( .m)中可以找到的类结构相同.
由于我来自其他语言而没有Objective C接口这样的东西,我想知道是否有一些或几种用途我缺少或者这只是一种惯例,这种特定的语言可能从它的前辈继承.
谢谢!
环顾不同的代码库,我看到了各种风格:
头文件中定义的类"接口"和cpp文件中的实际impl.在这种方法中,标题看起来很好定义并且易于阅读,但cpp文件看起来很混乱,因为它只是一个方法列表.
我看到的第二种方法就是将所有内容放在单个类cpp文件中.这些类文件包含类定义主体中的定义和实际方法.这种方法对我来说看起来更好(更像是Java和c#).
我应该使用哪种风格?
第一件事是我真的不想在堆栈代码交换上发布这个,因为这是在大约5分钟内编写的少量代码.
我想问你我写的课(我在c ++中的第一篇)是否可以接受.我真的没有很多c ++代码,所以我无法将其与任何东西进行比较.
但我已经看到一些只实现函数声明的类,这些函数的内部编写在代码中的其他地方.
如果有什么东西是错的,我会问你任何建议.为什么他们按照我在上面的段落中描述的那样做?哪种编码风格更好?
class File {
private:
FILE *_handler;
char *_path;
long _size;
void setHandler(char *mode)
{
this->_handler = fopen(this->_path, mode);
}
public:
File(char *path)
{
this->_path = path;
}
size_t read()
{
this->setHandler("r");
char *buffer = (char*) malloc(sizeof(char)*this->_size);
return fread(buffer, 1, this->_size, this->_handler);
}
void write(char *data)
{
this->setHandler("w");
fputs(data, this->_handler);
}
long size()
{
if(! sizeof(this->_size) > 0)
{
fseek(this->_handler, 0, SEEK_END);
this->_size = ftell(this->_handler);
rewind(this->_handler);
}
return this->_size;
}
}; // End File
Run Code Online (Sandbox Code Playgroud) 说我有一些源代码MyAmoeba.cpp,带有相关的头文件MyAmoeba.h.在MyAmoeba.cpp中包含MyAmoeba.h是不错的做法?(我假设它从来没有必要,除了可能在一些设计糟糕的情况下,头文件包含一个宏来更改源文件)
据我所知,执行上述操作意味着如果您更改MyAmoeba.cpp中的任何内容的签名,但忘记在MyAmoeba.h中执行此操作,则错误将在编译阶段而不是在链接阶段发生,但我不确定这是好事/坏事/无关紧要的事情.
我对c ++ btw相当新,如果这个问题无论如何都是荒谬的(如果是这样的话,请指出我)
编辑:我正在玩一个只包含函数声明的头文件,但没有类/结构/等定义.从其他来源和下面的答案,在我看来,当头文件只有声明时,没有必要在相关的源文件中包含头文件,但如果头文件中有任何定义,那么它确实必要的(因为您可以根据需要多次声明,但只定义一次,并且显然可以使用定义代替声明,因此源文件中的函数定义将同时计为我的声明).
考虑这个链接.看到这段代码:
class MyClass
{
public:
MyClass();
~MyClass();
private:
int _a;
};
MyClass::MyClass()
{
}
MyClass::~MyClass()
{
}
Run Code Online (Sandbox Code Playgroud)
我们可以在类中声明构造函数.
为什么我可以在类中声明构造函数以及为什么要这样做?
c++ ×12
class ×4
oop ×3
class-design ×2
header-files ×2
arduino ×1
g++ ×1
header ×1
java ×1
objective-c ×1