it-swarm-eu.dev

Co dělat, když nenávidím soubory záhlaví C ++?

O souborech záhlaví jsem byl vždy zmatený. Jsou tak podivní: zahrnete soubor .h, který neobsahuje .cpp, ale .cpp jsou také nějak kompilovány.

Nedávno jsem se připojil k týmovému projektu a samozřejmě se používají jak .h, tak .ppp.
Chápu, že je to velmi důležité, ale nemůžu žít s kopírováním každého funkčního prohlášení v každé z více tříd, které máme.

Jak efektivně zvládám konvenci se dvěma soubory?
Existují nějaké nástroje, které vám s tím pomohou, nebo automaticky změní jeden soubor, který vypadá níže, na .h a .cpp? (konkrétně pro MS VC++ 2010)

class A
{
...
    Type f(Type a,Type b)
    {
        //implementation here, not in another file!
    }
...
};

Type f(Type a)
{
     //implementation here
}
...
25
Oleh Prypin

Můžete použít Lzz . Je to nástroj příkazového řádku, který přijímá prohlášení zapsaná v syntaxi C++ a generuje záhlaví a zdrojové soubory.

3
Mario Becerra

Psaní více Refactoring Friendly C++

V C++ nemáte záhlaví. Celý objekt můžete definovat v jednom souboru stejně jako u C # nebo Java. Vývojáři C obvykle udržují externí volání pouze v hlavičkovém souboru. Všechna interní volání by byla definována v souboru .c. Stejným tokenem si můžete rezervovat vaše soubory C++ .h pro třídy/rozhraní (čistě virtuální abstraktní třídy)/atd. které jsou určeny ke sdílení mimo knihovnu DLL. U interních tříd/struktur/rozhraní atd. Byste jednoduše zahrnuli soubor .ppp, který potřebujete:

#include<myclass.cpp>

Nezdá se, že by to byl nejpopulárnější přístup, ale je to legální C++. Určitě by to byla možnost pro celý váš interní kód. To umožňuje internímu kódu a sadě tříd mnohem radikálnější změnu a zároveň poskytuje stabilnější rozhraní pro kód mimo vaši knihovnu/spustitelný soubor, se kterým lze interagovat.

Pokud celou svou třídu umístíte do jednoho souboru, usnadní vám to, co chcete. To nevyřeší problém přejmenování metody a nutnosti prohledávat každé místo, které se tato metoda nazývá, ale ujistí se, že máte více srozumitelných chybových zpráv. Nic horšího než nechat záhlaví deklarovat metodu jedním způsobem, ale implementujete ji jinak. Jiný kód, který volá soubor záhlaví, se zkompiluje správně a dostanete výjimku odkazu, zatímco implementační soubor bude ten, který si stěžuje, že metoda nebyla definována. Když definujete každou zavedenou metodu (ve skutečném prohlášení třídy), dostanete stejnou chybovou zprávu bez ohledu na to, jaký soubor obsahuje.

Můžete se také podívat na tuto otázku: Dobré nástroje pro refactorování pro C++

Jak C/C++ řeší soubory záhlaví/implementace

Na základní úrovni C (a C++ je postaveno na tomto základu) soubory záhlaví deklarují slib funkce/struktur/proměnné, který je dost umožní kompilátoru vytvořit soubor objektu. Podobně soubory záhlaví C++ deklarují příslib funkcí, struktur, tříd atd. To je definice, kterou kompilátor používá k rezervování místa v zásobníku atd.

Soubory .c nebo .ppp mají implementaci. Když kompilátor převádí každý implementační soubor na objektový soubor, existují háčky na neimplementované koncepty (to, co bylo deklarováno v záhlaví). Linker spojuje háčky s implementacemi v jiných souborech objektů a vytváří větší binární soubor, který obsahuje veškerý kód (sdílená knihovna nebo spustitelný soubor).

Specifické pro VS

Co se týče práce s těmi ve Visual Studio, existují i ​​někteří průvodci, kteří vám něco usnadní. Průvodce novou třídou vytvoří odpovídající pár hlavičkových a implementačních souborů. K dispozici je dokonce i funkce třídního prohlížeče, která vám umožní deklarovat nové metody. Vloží definici do záhlaví a implementační blok v souboru .ppp. Visual Studio má tyto funkce více než deset let (pokud je používám).

16
Berin Loritsch

Staňte se vývojářem Java).

Pokud opravdu musíte pokračovat ve vývoji v C++, můžete zkusit použít IDE. Často nabízejí nějaký mechanismus, pomocí kterého můžete do třídy přidat metodu a automaticky umístí deklaraci do souboru .h a definici do souboru .ppp.

13
Paul Butcher

Mohlo by vás zajímat program makeheaders od společnosti Hwaci (ti, kteří dělají SQLite a Fossil).

Podívejte se také na jak je fosilie postavena , abyste měli nápad.

8
Benoit

Když píšete první řádky nové třídy, obvykle je to proto, že je potřebujete na jednom místě pouze tehdy. Později může být použit na více místech, ale zpočátku to obvykle není.

Mnoho mých tříd začíná v horní části aktuálního souboru .cpp. Když je dostatečně stabilizován, aby byl použit na více místech, vložil jsem jej do záhlaví. I když často třída zmizí tak rychle, jak se zdálo.

5
Sjoerd

Soubor Header (.h) popisuje kód interface, protože to je pouze bit, který jiný kód dostane.

Soubor Source (.cpp) poskytuje implementaci kódu, o kterém nikdo jiný nemusí vědět.

zahrnete soubor .h, který neobsahuje .cpp ...

Opravit.

Jako spotřebitel tohoto kódu potřebujete pouze soubor záhlaví, aby kompilátor věděl, co je v tomto kódu k dispozici, abyste s ním mohli pracovat. Zdrojový kód C++ se v tomto okamžiku nepoužívá žádným způsobem, tvarem ani formou (nebo alespoň nemělo by být).

... ale .ppp jsou také nějak kompilovány.

Ano, to je, ale úplně samostatně.

Soubor cpp používaného modulu/knihovny je zkompilován vývojářem této knihovny do souboru Object (.o/.dll). Tento soubor objektů bude obsahovat vstupní body, které mají stejný „tvar“ jako ty, které jsou popsány v souboru záhlaví.

Budete potřebovat soubor Object, když přijdete na link váš hotový spustitelný soubor, v kterém okamžiku může Linker chytit obsah souboru Object a vložit jej do spustitelného souboru (to je pro statické propojení; dynamické propojení dostane komplikovanější)
V zásadě musí linker „spojit tečky“ mezi vstupními body, které váš kód očekává, aby mohl volat, na základě toho, co viděl v souboru záhlaví a co je vlastně v samotná knihovna).

0
Phill W.