c++-文件分離

来源:https://www.cnblogs.com/ygjzs/archive/2019/12/23/12089039.html
-Advertisement-
Play Games

實現文件分離 1.頭文件中不要使用using namespace,由於c++編譯的特性,由於初學還沒深入瞭解,不做具體編譯的解釋 2.由於沒有了命名空間,所以string定義要寫成std::string 3.main.cpp中引入staff.cpp,staff.cpp中引入staff.h main. ...


實現文件分離

1.頭文件中不要使用using namespace,由於c++編譯的特性,由於初學還沒深入瞭解,不做具體編譯的解釋
2.由於沒有了命名空間,所以string定義要寫成std::string
3.main.cpp中引入staff.cpp,staff.cpp中引入staff.h

main.cpp

#include <iostream>
#include <string>
#include <fstream>

#include "staff.cpp"

staff.cpp

#include <iostream>
#include <string>
#include <fstream>
#include "staff.h"

using namespace std;

這樣就可以通過編譯了

那麼為什麼呢?經過網上查閱資料找到了原因:

但是下麵的解釋我感覺還是有不對,下麵的內容僅供參考,帶我對c++有了更深的瞭解之後,再寫一篇完整的博客來解釋文件分離的實現,迫於課程設計的安排,不得不囫圇吞棗一下,嘻嘻嘻
還有一點就是在解決這,個問題的時候,又看到有說函數模板解決的,我現在大致明白了函數模板是乾什麼的,但在實現文件分離這一塊還不是很明白,以後再補上,嘿嘿嘿!!~··
接下來介紹一篇我發現的一篇博客,底部有轉載處:

  1. namespace和class

命名空間和類,非常相似,比如:

std::cout 和A::f(), 都用到了作用域符,都可以防止重名函數,可以更好的支持多人編程。

但是有幾個不同:

  1. namespace 可以寫在多個不同的文件中,而class只能在一個文件中。

  2. 如果想使用A類中的函數如A::f(), 需要建立一個類的實例(靜態函數等除外),而namespace則相當於本身就是一個建立好的實例,可以直接調用函數。

除此之外,可以將命名空間看做特殊的類。

需要註意的是千萬不要在h文件中使用using namespace,否則整個文件都會帶上。

  1. .h文件和.cpp文件

首先要知道的是兩種文件的最大區別:

編譯器將所有.cpp文件編譯為.obj文件再串聯起來。如果.cpp中有#include X.h文件,那麼第一步預處理會把X.h代碼粘貼到.cpp中代替#include語句。

基於這個特性,顯然,如果我們include 同一工程下的.cpp文件,那麼會將該.cpp文件重覆兩次(一次是本身的編譯,一次是include的複製)。因此,.cpp文件不適合進行include。

而我們往往需要在一個.cpp文件中include很多其他文件的代碼,那麼這時候就需要.h文件。

一個比喻就是.h是目錄,.cpp是內容。

這裡需要再說一下編譯的過程,關鍵是聲明和定義的區分。

如果是聲明的話,比如聲明瞭一個函數,在彙編語言中就會通過call語句等在全局中尋找這個函數,只需要這個函數在別的.cpp文件中有定義就可以了,而不需要當時就定義。

對變數也是這樣,當想使用一個別處定義的變數時,首先要聲明,使得該名字為程式所知。

如果不加“extern”的聲明,如

int j;

則會自動將j定義為j=0,自動初始化。那麼這時就會出現重覆定義等錯誤問題。

因此,應該使用

extern int j;

這將告知程式 有這樣一個j存在,就可以使用了。而j的定義在其他.cpp中,整體編譯完後就可以獲得j的定義了。

函數則會自動預設為是extern的效果。

因此,在.h中進行聲明,在.cpp中進行定義。可以避免重覆的編譯,也更便於管理。

註意,不能在函數體內初始化一個extern變數,因為函數體的作用域僅在函數內。

感謝這篇博客給的我啟發


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 循序漸進,看看只使用 CSS ,可以鼓搗出什麼樣的充電動畫效果。 畫個電池 當然,電池充電,首先得用 CSS 畫一個電池,這個不難,隨便整一個: 歐了,勉強就是它了。有了電池,那接下來直接充電吧。最最簡單的動畫,那應該是用色彩把整個電池灌滿即可。 方法很多,代碼也很簡單,直接看效果: 有內味了,如果 ...
  • 樣式操作模塊可用於管理DOM元素的樣式、坐標和尺寸,本節講解一下尺寸這一塊 jQuery通過樣式操作模塊里的尺寸相關的API可以很方便的獲取一個元素的寬度、高度,而且可以很方便的區分padding、border、 margin等,主要有六個API,如下: heihgt(size)、width(siz ...
  • Proise實例的then方法是定義在原型對象Promise.prototype上的,它的作用是為Promise實例添加狀態改變時的回調函數。 該方法可以接收兩個回調函數作為參數,其中第二個回調函數是可選的。第一個回調函數是 對象的狀態變為 時調用,第二個回調函數是 對象的狀態變為 時調用。 下麵從 ...
  • 一、finally語句塊 1.註意點: (1)finally語句塊可以直接和try語句塊聯合使用。try...finally.... (2)try.....catch.....finally也可以執行; (3)在finally語句塊中的代碼是一定會執行的。 package com.bjpowerno ...
  • package main import ( "fmt" "reflect" ) type BinaryNode struct { Data interface{} //數據 lChild *BinaryNode //左子樹 rChild *BinaryNode //右子樹 } //創建二叉樹 fun... ...
  • 1. 冒泡排序(bubble sort)的基本思想:比較相鄰兩個 元素的關鍵字值,如果反序,則交換 2. 快速排序 快速排序(quick sort)是一種分區交換排序演算法. 它的基本思想:在數據序列中選擇一個值作為比較的基準值, 每趟從數據序列的兩端開始交替進行,將小於基準值的元素交換到序列前端,將 ...
  • 場景 Dubbo簡介與基本概念: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103555224 Dubbo環境搭建-ZooKeeper註冊中心: https://blog.csdn.net/BADAO_LIUMANG_QIZH ...
  • “==”操作符 基本類型比較值:判斷兩個變數的值相等。 引用類型比較引用(是否指向同一個對象):只有指向同一個對象時才相等。 用“==”進行比較時,兩邊的數據類型必須相容(可自動轉換的基本數據類型除外)。 equals() 所有類都繼承了Object,也就是獲得了equals()方法,還可以重寫。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...