如何在 C++ 中包含 header 文件?
How to include a header file in c++?
/***You willl find good information in the answer selected and comments of post by @datell*****/
/**** Also there is something related to use off "modules" and "inline before template" (i am asking on template classes and not template functions, both are different) in c++, that if its related, i cant relate in reality(i am a noob)*****/
我在问如何在我的 main.cpp 中包含一个 header 文件,我已经在其中实现了基本的堆栈操作; main.cpp btack.h 和 btack.cpp。
编译器给出了一长串 linkage 错误(如果我在 btack.h 中给出声明和定义就可以正常工作,当然我不想为了模块化而这样做)。
它是一个模板 class。我将提供运行的代码,即没有 btack.cpp
main.cpp
#include <iostream>
using namespace std;
#include "btack.h"
int main() {
char a;
int z;
//std::cout << "Hello, World!\n";
btack <int> b(3);
btack <char> c(3);
b.push(4);
b.push(5);
btack.h
#ifndef btack_h
#define btack_h
#include <iostream>
using namespace std;
template <typename s> class btack
{
int TOS,size;
s *ptr;
public:
btack(int );
~btack();
void push(s ob);
s pop();
};
template <typename s> btack<s>::btack(int i)
{
ptr = (s*)malloc(i*sizeof(s));
TOS=0;
size=i;
}
template <typename s> void btack<s>::push(s ob)
{
if(TOS>=size)
{
cout<<"stack is full"<<endl;
return;
}
ptr[TOS]=ob;
TOS++;
}
template <typename s> s btack<s>::pop()
{
if(TOS<=0)
{
cout<<"stack is empty"<<endl;
return ((s) 0);
}
TOS--;
return ptr[TOS];
}
template <typename s> btack<s>::~btack()
{free(ptr);}
#endif /* btack_h */
所以基本上我浏览了很多互联网帖子,我发现你必须使用 "Export" 关键字,但该词已不再使用,我无法找到关于该主题的正确指南。请使用新的 c++ 标准。
指导我如何从头开始学习这件事。
拜托你们这些强大的编码员,指导 link 会有所帮助。
更新********
对于所有关于在 header 末尾显式声明数据类型的说法:
假设它是 stack.h 的 STL 实现,您无需显式实例化要使用的各种数据类型,它会自动执行
价值点数:
C++14 并不真正允许抽象模板...在某种意义上,它们需要 "concrete"(在 header 文件中实现)– Basile Starynkevitch
三个分开的文件
btack.cpp
与 btack 的 cpp 代码
btack.h
头文件
main.cpp
在main.cpp
中;在第一行写
#include "btack.h"
如果btack在同一个目录下;如果不是,写下文件的路径
然后编译main.cpp
和btack.cpp
(别忘了
#include "btack.h"
在 btack.cpp
)
由于您使用的是模板 class,因此您不需要任何 .cpp 文件来实现它。
所以你有两个文件:main.cpp
和 btack.h
。主要包含 #include "btack.h"
。
你用g++ main.cpp
编译它。
实际上,C++14 编译器需要了解每个聚合类型(特别是 实例化 模板 类)的大小、对齐方式、vtable(如果有)和字段序列 - 及其类型和对齐方式 -.
因此,模板实际上不是抽象类型,即使程序员应该这样看待它们。
因此,标准 containers headers(如 <vector>
、<map>
等...)通常包括很多 内部 东西定义了模板的内部实现,所有的模板成员函数都是内联的。
实际上,像 <vector>
这样的标准 header 被扩展到很多东西(在 Linux 上我的 GCC 6 编译器上大约有一万行 C++)。
使用具有 #include <vector>
的简单文件 mytest.cc
尝试以下命令(它是预处理):
g++ -C -E -H -Wall mytest.cc > mytest.ii
-H
选项显示所有内部包含的文件。 -C -E
要求预处理表格,并在 mytest.ii
中添加注释。然后用编辑器(或寻呼机)查看生成的 mytest.ii
;会很大的。
这就是 C++ 编译通常很慢的原因。
模块是 C++ 的未来功能,可能会有所帮助。参见 this question。
// stack node structure
struct Node {
char data;
struct Node* next;
};
struct Node* initiStack(void);
int isEmpty(struct Node** top);
// push function
void push(struct Node** top, int data);
// pop function
int pop(struct Node** top);
int peek(struct Node** top_re);
int size(char expn[]);
/***You willl find good information in the answer selected and comments of post by @datell*****/
/**** Also there is something related to use off "modules" and "inline before template" (i am asking on template classes and not template functions, both are different) in c++, that if its related, i cant relate in reality(i am a noob)*****/
我在问如何在我的 main.cpp 中包含一个 header 文件,我已经在其中实现了基本的堆栈操作; main.cpp btack.h 和 btack.cpp。 编译器给出了一长串 linkage 错误(如果我在 btack.h 中给出声明和定义就可以正常工作,当然我不想为了模块化而这样做)。 它是一个模板 class。我将提供运行的代码,即没有 btack.cpp
main.cpp
#include <iostream>
using namespace std;
#include "btack.h"
int main() {
char a;
int z;
//std::cout << "Hello, World!\n";
btack <int> b(3);
btack <char> c(3);
b.push(4);
b.push(5);
btack.h
#ifndef btack_h
#define btack_h
#include <iostream>
using namespace std;
template <typename s> class btack
{
int TOS,size;
s *ptr;
public:
btack(int );
~btack();
void push(s ob);
s pop();
};
template <typename s> btack<s>::btack(int i)
{
ptr = (s*)malloc(i*sizeof(s));
TOS=0;
size=i;
}
template <typename s> void btack<s>::push(s ob)
{
if(TOS>=size)
{
cout<<"stack is full"<<endl;
return;
}
ptr[TOS]=ob;
TOS++;
}
template <typename s> s btack<s>::pop()
{
if(TOS<=0)
{
cout<<"stack is empty"<<endl;
return ((s) 0);
}
TOS--;
return ptr[TOS];
}
template <typename s> btack<s>::~btack()
{free(ptr);}
#endif /* btack_h */
所以基本上我浏览了很多互联网帖子,我发现你必须使用 "Export" 关键字,但该词已不再使用,我无法找到关于该主题的正确指南。请使用新的 c++ 标准。 指导我如何从头开始学习这件事。 拜托你们这些强大的编码员,指导 link 会有所帮助。
更新******** 对于所有关于在 header 末尾显式声明数据类型的说法: 假设它是 stack.h 的 STL 实现,您无需显式实例化要使用的各种数据类型,它会自动执行
价值点数:
C++14 并不真正允许抽象模板...在某种意义上,它们需要 "concrete"(在 header 文件中实现)– Basile Starynkevitch
三个分开的文件
btack.cpp
与 btack 的 cpp 代码
btack.h
头文件
main.cpp
在main.cpp
中;在第一行写
#include "btack.h"
如果btack在同一个目录下;如果不是,写下文件的路径
然后编译main.cpp
和btack.cpp
(别忘了
#include "btack.h"
在 btack.cpp
)
由于您使用的是模板 class,因此您不需要任何 .cpp 文件来实现它。
所以你有两个文件:main.cpp
和 btack.h
。主要包含 #include "btack.h"
。
你用g++ main.cpp
编译它。
实际上,C++14 编译器需要了解每个聚合类型(特别是 实例化 模板 类)的大小、对齐方式、vtable(如果有)和字段序列 - 及其类型和对齐方式 -.
因此,模板实际上不是抽象类型,即使程序员应该这样看待它们。
因此,标准 containers headers(如 <vector>
、<map>
等...)通常包括很多 内部 东西定义了模板的内部实现,所有的模板成员函数都是内联的。
实际上,像 <vector>
这样的标准 header 被扩展到很多东西(在 Linux 上我的 GCC 6 编译器上大约有一万行 C++)。
使用具有 #include <vector>
的简单文件 mytest.cc
尝试以下命令(它是预处理):
g++ -C -E -H -Wall mytest.cc > mytest.ii
-H
选项显示所有内部包含的文件。 -C -E
要求预处理表格,并在 mytest.ii
中添加注释。然后用编辑器(或寻呼机)查看生成的 mytest.ii
;会很大的。
这就是 C++ 编译通常很慢的原因。
模块是 C++ 的未来功能,可能会有所帮助。参见 this question。
// stack node structure
struct Node {
char data;
struct Node* next;
};
struct Node* initiStack(void);
int isEmpty(struct Node** top);
// push function
void push(struct Node** top, int data);
// pop function
int pop(struct Node** top);
int peek(struct Node** top_re);
int size(char expn[]);