我正在制作一个项目,我对一个问题感到震惊.
我有3个libraries.h,包括另一个特殊的库,definitions.h,但在我的主模块中,我想只包含所有库一次,我的意思是,我想测试是否definitions.h已经包含了库,并包括是否取决于结果.
就像是
If !(#include"definitions.h")
(#include"definitions.h")
Run Code Online (Sandbox Code Playgroud) 是否可以在类声明之外定义函数或方法?如:
class A
{
int foo;
A (): foo (10) {}
}
int A::bar ()
{
return foo;
}
Run Code Online (Sandbox Code Playgroud) 我正在经历实现定义的行为控制
并且有以下与 相关的文字#pragma once:
与头文件保护不同的是,这个 pragma 使得不可能在多个文件中错误地使用相同的宏名称。
我不确定这意味着什么。有人可以解释一下吗?
TIA
这听起来很奇怪,但也许存在一个...我用Google搜索,但没有找到任何东西.
简单的例子:
我有一个文件class1.h:
#include "a.h"
#include "b.h"
Run Code Online (Sandbox Code Playgroud)
另一个文件class2.h:
#include "a.h"
#include "c.h"
Run Code Online (Sandbox Code Playgroud)
和main.cpp:
#include "class2.h" //as we see here, we getting "a.h" double included by class1.h and class2.h
Run Code Online (Sandbox Code Playgroud)
我想在我的项目中摆脱这种欺骗.
当然,在例子中并没有那么难,但我有大量的文件,它们在很多方面相互包含,很难自己追踪所有的欺骗.
在我自己编写该工具之前,有什么建议吗?:)
所以我仍然习惯于模块化编程,并希望确保我坚持最佳实践.如果我有下面的两个模块头文件,是否会#included多次包含每个文件的标题(例如"mpi.h")?有没有正确的方法来解释这个?
此外,我的模块标题通常看起来像这些示例,因此任何其他批评/指针都会有所帮助.
/* foo.h */
#ifndef FOO_H
#define FOO_H
#include <stdlib.h>
#include "mpi.h"
void foo();
#endif
Run Code Online (Sandbox Code Playgroud)
和
/* bar.h */
#ifndef BAR_H
#define BAR_H
#include <stdlib.h>
#include "mpi.h"
void bar();
#endif
Run Code Online (Sandbox Code Playgroud)
并使用示例程序:
/* ExampleClient.c */
#include <stdlib.h>
#include <stdio.h>
#include "mpi.h"
#include "foo.h"
#include "bar.h"
void main(int argc, char *argv[]) {
foo();
MPI_Func();
bar();
exit(0)
}
Run Code Online (Sandbox Code Playgroud) 我收到链接器错误:
duplicate symbol __ZN5ENDF64FileILNS_7MF_enumE1EE4readEv in:
Read.cpp.o
Material.cpp.o
Run Code Online (Sandbox Code Playgroud)
其中重复的符号名称是:
$ c++filt __ZN5ENDF64FileILNS_7MF_enumE1EE4readEv
ENDF6::File<(ENDF6::MF_enum)1>::read()
Run Code Online (Sandbox Code Playgroud)
我知道我不能在多个地方定义相同的功能 - 这是导致此链接器错误的原因.(我已经看到了这个问题:ld:复制符号)我不认为我read()在多个地方定义了函数,但是链接器(clang++)说我做了.
我在哪里复制read()符号?
我的代码结构如下所示:
//MFs.hpp
#ifndef MFS_HPP
#define MFS_HPP
enum class MF_enum {
...
}
#endif
//File.hpp
#ifndef FILE_HPP
#define FILE_HPP
#include "MFs.hpp"
// Definition of class File
template<>
class File {
...
}
// Definition of File<...>::read() function
template <>
void File<1>::read()
{
std::cout << "Reading into MF=1"<< std::endl;
}
#endif
Run Code Online (Sandbox Code Playgroud)
没有,File.cpp因为File课程是模板化的.所有定义(和声明)都在File.hpp
// …Run Code Online (Sandbox Code Playgroud) 正如你可能从这个问题中猜到的那样,我对使用c ++的oop编程很新.(之前我只做过Java)无论如何,我正在尝试为Arduino项目创建一个自定义类并得到上面提到的错误.这是我的文件:
标头Touchable.h
#ifndef Touchable
#define Touchable
#include <Adafruit_TFTLCD.h>
#include <Arduino.h>
class Touchable {
public:
int posX;
int posY;
Touchable(int, int); //<-- Error here
~Touchable();
void Touchable::draw();
};
#endif
Run Code Online (Sandbox Code Playgroud)
和Touchable.cpp
#include "Touchable.h" //include the declaration for this class
#include <Adafruit_TFTLCD.h>
Touchable::Touchable(int x, int y) {
posX = x;
posY = y;
}
Touchable::~Touchable() {
/*nothing to destruct*/
}
//turn the LED on
void Touchable::draw() {
//tft.fillRect(posX, posY, 100, 100, 0x0000);
}
Run Code Online (Sandbox Code Playgroud)
编辑:编译器消息:
In file included from sketch/Touchable.cpp:1:0:
Touchable.h:11: error: expected …Run Code Online (Sandbox Code Playgroud) 我查看了C编程语言的不同源代码,发现#define的使用风格不同。
我从技术上知道他们的用例,不管它们的样式如何,它们都可以按预期工作,但是从编码准则出发,我想问一下它们的含义以及何时使用特定的。
#define MY_DEFINE_H
#define MY_DEFINE_H_
#define MY_DEFINE_H__
#define __MY_DEFINE_H__
Run Code Online (Sandbox Code Playgroud)
另外,如果可以的话,请分享一些参考,以便我详细介绍。
我需要一个实用程序来检查标题保护中的冲突.如果实用程序可以检查符号和文件名是否一致(使用正则表达式或其他东西),那将是很好的.
问候,rn141.
编辑:
示例1.断头防护罩.不能防止多重包含.
// my_file1.h
#ifndef my_project_my_file1_h__
#define my_project_my_fil1_h__ // should be my_project_my_file1_h__
// code goes here
#endif
Run Code Online (Sandbox Code Playgroud)
示例2.与上述标题保护冲突.
// my_file2.h
#ifndef my_project_my_file1_h__ // should be my_project_my_file2_h__
#define my_project_my_file1_h__ // should be my_project_my_file2_h__
// code goes here
#endif
Run Code Online (Sandbox Code Playgroud) 我正在创建一些类,我决定创建一个基本类,其他类将继承该基本类
所以这是我的基本类头
#pragma once
#include "ImageService.h"
class State
{
public:
State( ImageService& is );
~State();
void Update();
};
Run Code Online (Sandbox Code Playgroud)
不要担心方法,它们不是问题.所以现在我继续创建像这样的IntroState(头文件)
#pragma once
#include "State.h"
class IntroState : public State
{
public:
IntroState(ImageService& imageService);
~IntroState();
GameState objectState;
};
Run Code Online (Sandbox Code Playgroud)
这是cpp文件
#include "IntroState.h"
IntroState::IntroState(ImageService& imageService)
{
//error here
}
IntroState::~IntroState()
{
}
Run Code Online (Sandbox Code Playgroud)
在构造函数中它声明"没有类"State""的默认构造函数,现在我认为正在进行的是,State的默认构造函数需要传递给它的imageService引用.那么我如何将此构造函数中的imageservice传递给状态构造函数?
c++ ×7
c ×4
arduino ×1
clang ×1
coding-style ×1
declaration ×1
definition ×1
duplicates ×1
function ×1
header-files ×1
include ×1
inheritance ×1
linker ×1
macros ×1
oop ×1
pragma ×1