簡體   English   中英

沒有標題的c ++類

[英]c++ class without header

好的,所以我沒有問題,但是有一個問題:使用c ++時,您可以將類轉移到另一個文件並包含它而無需創建標頭,如下所示:

foo.cpp:

#include <iostream>
using namespace std;

class foo
{
public:
   string str;
   foo(string inStr)
   {
       str = inStr;
   }
   void print()
   {
      cout<<str<<endl;
   }
};

main.cpp:

#include "foo.cpp"
using namespace std;

int main()
{
   foo Foo("That's a string");
   Foo.print();
   return 0;
}

所以問題是:這種方法是否比使用頭文件還要糟糕? 它更容易使用,也更干凈,但是會更慢,是否會引起更多錯誤? 我已經搜索該主題很長時間了,但是考慮到這個選項,我還沒有在互聯網上看到一個主題...

命名文件.cpp.hpp (或.c / .h )沒有語義上的區別。

人們會對#include "foo.cpp"感到驚訝,編譯器不在乎

您仍然創建了“頭文件”,但給了它“ .cpp”擴展名。 文件擴展名是給程序員的,編譯器不在乎。

從編譯器的角度來看,您的示例與

foo.h:

#include <iostream>
using namespace std;

class foo
{
  //...
};

main.cpp:

#include "foo.h"
using namespace std;

int main()
{
   // ...
}

“頭文件”只是您在頭文件中包含的文件,即另一個文件的頭文件(從技術上講,頭文件不必在文件頭,有時也不必,但通常是頭文件,因此是文件名)。

您僅創建了一個名為foo.cpp的頭文件。

通常,將帶有擴展名的頭文件命名為源文件不是一個好主意。 某些IDE和其他工具可能會錯誤地認為您的標頭是源文件,因此嘗試像編譯頭文件那樣進行編譯,否則就浪費了資源。

更不用說它可能引起您的同事的困惑。 源文件可能具有C ++標准只允許定義一次的定義(請參閱一個定義規則odr),因為其他文件中未包含源文件。 如果您將頭文件命名為源文件,則有人可能會認為無法在其中具有odr定義。

所以問題是:這種方法是否比使用頭文件還要糟糕?

您可以考慮復習“ C ++轉換單元”是什么的中心思想。

在您的示例中,預處理器的工作就像將foo.cpp的副本插入到main.cpp的內部副本中一樣。 預處理器執行此操作,而不執行編譯器。

所以...當編譯器是單獨的文件時,編譯器從不會看到您的代碼。 正是這個單一的,串聯的“翻譯單元”被提交給編譯器。 .hh和.cc中沒有魔術,只是它們滿足了您的同事(或老板)的期望。

現在考慮您的問題……翻譯單元既不是您的源文件,也不是您的系統的任何包含文件的文件,但它是預處理器將一堆文本(一件事)組合在一起。 那么它會好還是壞呢?


它更容易,更干凈,

有可能。 我在“私人”編碼工作中經常采用這種“不同”方法。

當我快速評估一下階乘使用gmpxx.h(mpz_class)時,確實確實采用了這些快捷方式,並且不需要.hpp文件即可正確創建我的編譯單元。 僅供參考-12345的階乘是超過45,000字節。 讀字符也毫無意義。

作為“更正式”的工作(工作,合作等),我總是使用頭文件,並進行單獨的編譯,並建立對應用程序有用的函數庫,作為應做事情的一部分。 特別是如果我可能共享此代碼或為公司檔案做貢獻。 我有太多充分的理由來描述為什么我建議您學習這些問題。


但這會更慢,會引起更多錯誤嗎?

我想不是。 我想不是。 有一個編譯單元,連接各個部分必須正確,但是我認為這不再困難。


我已經搜索該主題很長時間了,但是考慮到這個選項,我還沒有在互聯網上看到一個主題...

我不確定我是否看過它。 我已經獲得了信息。 通常認為分開的編譯和庫開發可以節省開發時間。 (時間就是金錢,對嗎?)

此外,庫和頭文件是如何將成功打包給他人使用的方法,以及如何提高團隊價值的方法。

如果您曾經構建過一個更大的項目,那么兩個主要區別將對您顯而易見:

  1. 如果將代碼作為庫交付給其他人,則必須將所有代碼(全部IP)提供給他們,而不是僅提供公開類的頭以及已編譯的庫。

  2. 如果您在任何文件中更改一個字母,則將需要重新編譯所有內容 一旦大型項目的編譯時間縮短了數分鍾,您將失去很多生產力。

否則,它當然可以工作,並且結果是相同的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM