如何在c ++中包含头文件?

时间:2017-04-11 08:50:29

标签: c++ templates header-files preprocessor

/***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中包含头文件,我已经在其中实现了基本的堆栈操作; main.cpp btack.h和btack.cpp。 编译器提供了很长的链接错误列表(如果我在btack.h中给出声明和定义,那么工作正常,当然我不想为模块化做这件事)。 它是一个模拟课程。我将提供运行的代码,即没有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 */

所以基本上我经历了这么多互联网帖子,我发现你必须使用&#34; Export&#34;关键字,但不再使用该单词,我无法找到关于此主题的正确指南。请给我新的c ++标准。 如何从头开始学习这个东西的指南。 请你强大的编码员,指导链接将有所帮助。

更新******** 对于所有那些在标题末尾明确声明数据类型的人: 假设它是stack.h的STL实现,你不要显式地实例化你想要使用的各种类型的数据类型,它会自动执行该操作

值得点:

C ++ 14并不真正允许抽象模板......从某种意义上说,它们需要具体的&#34;具体的&#34; (在头文件中实现) - Basile Starynkevitch

4 个答案:

答案 0 :(得分:1)

由于您使用的是模板类,因此不需要任何.cpp文件来实现它。

所以你有两个文件:main.cppbtack.h。 Main包含#include "btack.h"

使用g++ main.cpp编译它。

答案 1 :(得分:1)

实际上,C ++ 14编译器需要知道每个聚合类型(特别是实例化的模板类)的大小,对齐方式,vtable(如果有的话)和序列字段 - 与它们的类型和对齐 - 。

因此,模板几乎而不是抽象类型,即使程序员应该以这种方式查看它们。

因此,标准containers标题(如<vector><map>等...)通常包含很多内部内容,用于定义模板的内部实现,并且所有模板成员函数都是内联的。

实际上,像<vector>这样的标准标题扩展到很多东西(Linux上我的GCC 6编译器上大约有一万行C ++)。

使用包含mytest.cc的简单文件#include <vector>尝试以下命令(正在预处理):

 g++ -C -E -H -Wall mytest.cc > mytest.ii

-H选项显示所有内部包含的文件。 -C -E要求预处理表单并在mytest.ii中添加评论。然后用编辑器(或寻呼机)查看生成的mytest.ii;它会很大。

这就是为什么C ++编译通常很慢的原因。

模块是C ++的未来特性,可以提供帮助。请参阅this question

答案 2 :(得分:0)

三个分开的文件

btack.cpp使用btack的cpp代码 btack.h头文件 main.cpp

<{1>}中的

;在第一行写下

main.cpp

如果btack在同一目录中;如果不是,请写下文件的路径

然后编译 #include "btack.h" main.cpp(也不要忘了 btack.cpp)中的#include "btack.h"

答案 3 :(得分:0)

// 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[]);
相关问题