it-swarm-eu.dev

obsazení ve stylu c nebo obsazení ve stylu c ++

Co tedy používáte?

int anInt = (int)aFloat;

nebo

int anInt = static_cast<int>(aFloat);
// and its brethren

A co je důležitější, proč?

21
bastibe

Nejprve si uvědomte, že tyto řádky nejsou ekvivalentní .

int* anInt = (int*)aFloat; // is equivalent to

int* anInt = reinterpret_cast<int*>(aFloat); 

Zde se děje to, že programátor žádá kompilátor, aby udělal vše, co je v jeho silách.

Rozdíl je důležitý, protože použití static_cast bude vyžadovat pouze základní typ, který je „bezpečný“ pro převod, kde reinterpret_cast se převede na cokoli, možná jen mapováním požadovaného rozložení paměti na paměť daného objektu.

Vzhledem k tomu, že „filtr“ není stejný, použití konkrétního obsazení je jasnější a bezpečnější než použití obsazení C, pokud se spoléháte na kompilátor (nebo za běhu impl. Pokud používáte dynamický_cast) a řeknete vám, kde jste udělali něco špatného , vyhýbáním se C a reinterepret_cast.

Nyní, když je to jasnější, je tu ještě jedna věc: static_cast, reinterpret_cast, const_cast a dynamic_cast se snáze vyhledávají .

A konečný bod: jsou ošklivé . To je chtěl. Potenciálně kód buggy, pachy kódu, zřejmé „triky“, které by mohly generovat chyby, lze snáze sledovat, pokud je spojen s ošklivým vzhledem. Špatný kód by měl být ošklivý .

To je „záměrně“. A to umožňuje vývojáři vědět, kde mohl dělat věci lépe (úplným vyhýbáním se sádrům, pokud to opravdu není nutné) a kde je to v pořádku, ale v kódu je to „zdokumentováno“ označením jako ošklivé.

Druhotným důvodem pro zavedení obsazení nového stylu bylo, že obsazení ve stylu C je v programu velmi obtížné najít. Nemůžete například pohodlně vyhledávat obsazení pomocí běžného editoru nebo textového procesoru. Tato téměř neviditelnost obsazení ve stylu C je nešťastná, protože jsou tak potenciálně škodlivé. Ošklivá operace by měla mít ošklivou syntaktickou formu. Toto pozorování bylo součástí důvodu pro výběr syntaxe pro obsazení nového stylu. Dalším důvodem bylo to, že obsazení nového stylu odpovídalo notaci šablony, takže programátoři mohou psát vlastní obsazení, zejména obsazení kontrolované při běhu.

Možná, protože static_cast je tak ošklivý a tak těžký na psaní, je pravděpodobné, že si dvakrát rozmyslíte, než jej použijete? To by bylo dobré, protože v moderním C++ je obsazení opravdu možné se vyhnout.

Zdroj: Bjarne Stroustrup (C++ tvůrce)

47
Klaim

Obsazení C++ je více omezující (takže lépe vyjadřujte svůj záměr a usnadněte kontrolu kódu atd.). Jsou také mnohem snazší hledat, pokud to potřebujete.

37
Bruce Stephens

Varianta C: obsazení „ve stylu C++“, protože je nerozeznatelné od konstrukce:

int anInt = int(aFloat);

nebo dokonce:

int anInt(aFloat);

Kromě těchto triviálních případů s primitivy, které jsou dobře srozumitelné, dávám přednost použití x_castů před sádry ve stylu C. Existují tři důvody, proč:

  • Užší definování operace, kterou se programátor pokoušel provést.

  • Mohou provádět akce, které obsazení ve stylu C nemohou (zejména v případě Dynamic_cast <>, které mohou procházet napříč větvemi řetězce s více dědičností).

  • Jsou ošklivé. Hlasitě prohlašují, že programátor pracuje proti systému typu. V tomto případě je to dobrá věc.

13
Kaz Dragon

Mám několik pravidel ohledně obsazení ve stylu C/C++:

  1. Odpojení konstanty musí vždy použít const_cast. Ze zřejmých důvodů. Je smutné, že moje pravidlo o použití konstanty způsobující, že se klávesnice zvedne a zlomí prst programátora, nebylo schváleno.
  2. Kterýkoli ze shenaniganů ve stylu bitové manipulace, na který se programátoři dostanou až při přechodu na kov, by měl použít reinterpret_cast. Je to opravdu ten typ obsazení, které C nemá: předstírat, že toto celé číslo je vlastně floatem. Tím se zabrání nepříjemnostem jako (int)(*(int*)(&floatVar)).
  3. Pokud napíšete slova „dynamic_cast“, Zastavte a přehodnoťte hierarchii a design vaší polymorfní třídy. Pokračujte v přehodnocování designu hierarchie třídy, dokud tato slova nesmažete.
  4. Neobtěžujte se static_cast.

Důvodem č. 4 je prostě to, že na tom nezáleží. Okolnosti, které nezapadají do jiných pravidel, jsou buď zřejmé, nebo skutečně nízké úrovně. Dobře srozumitelná konverze jednoduchých typů, jako je int-float, by neměla vyžadovat zvláštní syntaxi. A pokud jste v hlubokých, ošklivých vnitřnostech něčeho, dobře, jste v hlubokých, ošklivých vnitřnostech něčeho. Není třeba upozorňovat na skutečnost, že „tady jsou draky“, protože zuby, drápy a oheň to už dávno rozdaly.

7
Nicol Bolas

Pokud píšete kód v C, použijte C cast. Pokud zapisujete v C++, použijte obsazení C++.

I když většina castingů narušuje správnou typovou bezpečnost, ty C++ jsou restriktivnější, a proto jste o něco méně nebezpeční pro typ, než byste byli při obsazení C.

Mohu někoho tolerovat pomocí (T *) NULL, i když nutím přetížení ...

7
CashCow

Jak výše uvedené příspěvky poznamenají, C++ (statický) obsazení je v praxi o něco bezpečnější.

Může být chytré vyhledat více informací o různých druzích obsazení a jejich výhodách a nevýhodách.

Jen abych měl více informací o tom, proč. .

http://en.wikipedia.org/wiki/Static_cast

http://en.wikipedia.org/wiki/Dynamic_cast

http://en.wikipedia.org/wiki/Reinterpret_cast

4
the JinX

Skutečně záleží na tom, s jakým jazykem pracuji, protože víte, co říkají: V Římě mluvte římsky. Pokud tedy programuji v jazyce C, snažím se používat funkce C na maximum, ale pokud programuji na C++, pokračuji a používám funkce C++ na maximum, i když někteří lidé nemají rádi tento přístup, protože říkají, že to dělá kód "méně přenosným", říkám, že je mi to jedno, jsem v C++ a programuji v C++ a potřebuji plně kompilátor kompatibilní s C++ pro kompilaci kódu, jinak bych pracoval s něčím jiným na prvním místě.

3
Coyote21

static_cast atd. byly vynalezeny kvůli problémům s obsazeními stylu C při použití v šablonách. Pokud píšete šablonu, nebo pokud jste kód později mohli být převedeni na šablonu, je vhodné použít obsazení ve stylu C++. Důvod je ten, že styl C++ vrhá lépe vyjádřený úmysl, takže budou dávat očekávané výsledky v případech, kdy obsazení ve stylu C udělá špatnou věc (dané konkrétní typy jako parametry šablony).

Kromě toho říkám, že použiji obsazení ve stylu C++, pokud máte konkrétní problém, který je potřebuje - dynamic_cast je nejčastější, ale ani to pravděpodobně není každodenní věc.

Cokoliv jiného a obsazení ve stylu C může být trochu méně nepřehledné a může usnadnit čitelnost, nebo nemusí záviset na tom, jak dobře je čtenář s tímto stylem obsazení obeznámen. Podle mého názoru to není opravdu důležité, většinou jde o osobní preferenci, i když se nemusíte divit, pokud se některým lidem nelíbí styl C.

Závěrečná poznámka - pokud potřebujete tolik obsazení, že je to velký problém, pravděpodobně děláte něco jiného špatně. V některých případech existují výjimky, ale většina kódů na vysoké úrovni by neměla potřebovat mnoho (pokud vůbec) obsazení.

3
Steve314