簡體   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