[英]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.cpp
和btack.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.cpp
和btack.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.