繁体   English   中英

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

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

回车.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 */

所以基本上我浏览了很多互联网帖子,我发现您必须使用“导出”关键字,但不再使用该词,我无法找到有关此主题的正确指南。 请使用新的 C++ 标准。 我如何从头开始学习这件事的指南。 请您强大的编码人员,指导链接将有所帮助。

更新******** 对于所有关于在标题末尾显式声明数据类型的说法:假设它是 stack.h 的 STL 实现,您没有显式实例化要使用的各种类型的数据类型,它自动这样做


价值点:

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

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

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

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

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

因此,模板实际上不是抽象类型,即使程序员应该那样看待它们。

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

在实践中,像<vector>这样的标准头文件被扩展为很多东西(在 Linux 上的 GCC 6 编译器上大约有一万行 C++)。

使用一个简单的文件mytest.cc尝试以下命令(它是预处理),其中mytest.cc #include <vector>

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

-H选项显示所有内部包含的文件。 -C -E要求在mytest.ii提供带有注释的预处理形式。 然后用编辑器(或寻呼机)查看生成的mytest.ii 它会很大。

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

模块是 C++ 的未来特性,可以提供帮助。 看到这个问题

三个分开的文件

btack.cpp带有 btack btack.h头文件main.cpp的 cpp 代码

main.cpp 在第一行写

 #include "btack.h"

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

然后编译main.cppbtack.cpp (不要忘了还#include "btack.h"btack.cpp

// 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[]);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM