LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> C/C++ (34) - Drobná vylepšení C++

C++ nepřináší jen "velké" vlastnosti, jakými jsou podpora objektově orientovaného programování nebo šablony. Oproti C nabízí celou řadu drobných vylepšení a některá z nich si dnes probereme.

13.2.2006 09:00 | Jan Němec | Články autora | přečteno 18373×

Komentář

C++ umožňuje jednořádkový komentář uvozený //.

// Tohle je komentář ve stylu C++
/* Tohle je komentář ve stylu C */

Je ovšem pravda, že komentář uvozený // umožňuje i norma C z roku 1999 a často jej tolerují i starší překladače C. C++ komentář je možné vložit do C komentáře, lze tedy psát například

/*
Tuhle funkci nepotřebujeme, ale zatím ji nebudeme mazat.

// Komentář k funkci
void funkce(void) {
  // Komentář k implementaci
}

*/

Tradiční řešení ve stylu C je trochu neohrabané, neboť komentář /* */ nelze vkládat do sebe.

#if 0
Tuhle funkci nepotřebujeme, ale zatím ji nebudeme mazat.

/* Komentář k funkci */
void funkce(void) {
 /* Komentář k implementaci */
}

#endif

Hlavičkové soubory

Hlavičkové soubory standardní knihovny jazyka C jsou v C++ dostupné buď původním způsobem tj. například

#include <stdio.h>

nebo pomocí předpony c a bez .h.

#include <cstdio>

U souborů specifických pro standardní knihovnu C++ tuto volbu nemáme, inkludují se bez předpony i bez přípony.

#include <vector>

Inline funkce

Volání funkce na úrovni strojového kódu vyžaduje určitou režii spojenou s předáváním parametrů, adresy volajícího kódu, návratové hodnoty i s provedením skoků na adresu volané funkce a zpět. V případě velmi jednoduchých funkcí typu sečti dvě čísla je tato režie větší než doba strávená vykonáním těla funkce. V C se považuje za standardní řešení makro, které se na textové úrovni rozvine v místě volání. C++ nabízí navíc klíčové slovo inline, kterým doporučujeme překladači, aby na úrovni přeloženého kódu funkci v místech volání rozvinul, podobně jako makro na úrovni kódu zdrojového. Funkce potom bude součástí volajícího kódu, existovat tedy bude v tolika instancích, kolikrát je volána.

inline int plus(int x, int y) {
  return x + y;
}

Je zřejmé, že přílišnou duplikací kódu (ať už pomocí inline funkcí, maker nebo dokonce prostého kopírování na úrovni zdrojového kódu) můžeme výsledný program naopak zpomalit. Z hlediska keše na úrovni procesoru je výhodnější malé výkonné jádro programu a to může být důležitější než ušetření režie při volání funkce.

Přístupnost globálních identifikátorů

V C++ je možné zpřístupnit překrytý globální identifikátor pomocí čtyřtečky.

#include <stdio.h>
const char *s = "globální řetězec";

int main(void) {
  const char *s = "lokální řetězec";

  printf("V C++ je přístupný %s i %s.\n", s, ::s);
  return 0;
}

Při procedurálním programování ve stylu C v dobře navrženém programu podobné překrytí globálního identifikátoru není příliš pravděpodobné, ale při použití objektově orientovaného programování podobný konflikt hrozí častěji. Je zcela přirozené definovat třeba třídu Socket s metodou listen, která přes čtyřtečku může zavolat překrytou knihovní funkci listen. Později si ukážeme, že čtyřtečka v C++ zapadá do obecnější koncepce prostorů identifikátorů.

Ternární operátor

Ternární operátor ?: vrací v C++ l-hodnotu, pokud je jeho druhý i třetí parametr l-hodnota.

(polozka < 0 ? maDati : dal) += polozka;

V C tomu tak není, a tak je třeba rozepsat kód do čitelnější podoby s if a else.

if (polozka < 0) maDati += polozka; else  dal += polozka;

Definice proměnných

V C++ je možné definovat lokální proměnnou kdekoli v bloku, nikoli jen na jeho začátku. Běžně se toho využívá a proměnná se často definuje až v místě prvního použití. Definice ovšem nesmí být přeskočena pomocí break nebo goto, pokud zároveň nepřeskočíme celý blok, v němž je proměnná definována.

void funkce1(void) {
  int i;
  i = 1;

  // V C++ OK
  int j;
}

void funkce2(void) {
  // chyba, přeskočení definice
  goto konec;
  int j;
  konec:;
}

void funkce3(void) {
  // OK, přeskočení celého bloku
  goto konec;
  {
    int j;
  }
  konec:;
}

Je zajímavé, že g++ bez problémů přeloží i test funkce2 (že by chyba?), ale stačí místo typu int použít třeba std::string (#include <string>) a překlad skončí takhle:

c.cpp: In function 'void funkce2()':
c.cpp:17: error: jump to label 'konec'
c.cpp:15: error:   from here
c.cpp:16: error:   crosses initialization of 'std::string j'

Proměnnou lze dokonce definovat i v řídících strukturách if, switch, for a while. V tom případě má platnost pouze v následujícím bloku nebo příkazu.

for (int i = 0; i < 10; i++) {
  printf("%i\n", i);
}

// Tady už i není definované

Známou chybou starší, ale dosud používané verze MS Visual C++ 6.0 je prodloužení platnosti proměnné, jako kdyby byla definována těsně před řídící strukturou. Programátorům, kterým záleží na maximální přenositelnosti kódu mezi různými překladači, bych proto doporučil podobné definice nepoužívat. V gcc funguje vše správně.

Domácí úkoly

  • Vyzkoušejte, jak je to s platností proměnné definované v řídící struktuře v případě Vašeho překladače. Napište korektní kód, který půjde přeložit pomocí g++, ale nikoli v MS Visual C++ 6.0 a nekorektní kód, kde tomu bude právě naopak.
  • Definujte nějakou velmi jednoduchou funkci a volejte ji v cyklu. Změňte ji na inline a ověřte, zda to má vliv na rychlost programu. Zkuste pomocí zpětného inženýrství zjistit, jestli se překladač vůbec řídil vaším doporučením a jestli je funkce opravdu inline.

Pokračování příště

V příštím dílu se podíváme na reference a na volání funkcí s různými sadami parametrů.

Verze pro tisk

pridej.cz

 

DISKUZE

g++ a MS VC++ 6.0 4.4.2006 08:38 RuDa
  L Re: g++ a MS VC++ 6.0 11.4.2006 05:42 Jan Němec




Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků

18.6.2018 0:43 /František Kučera

Červnový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 21. 6. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát na téma: F-Droid, aneb svobodný software do vašeho mobilu. Kromě toho budou k vidění i vývojové desky HiFive1 se svobodným/otevřeným čipem RISC-V.


Přidat komentář

23.5.2018 20:55 /Ondřej Čečák
Od pátku 25.5. proběhne na Fakultě informačních technologií ČVUT v Praze openSUSE Conference. Můžete se těšit na spostu zajímavých přednášek, workshopů a také na Release Party nového openSUSE leap 15.0. V na stejném místě proběhne v sobotu 26.5. i seminář o bezpečnosti CryptoFest.
Přidat komentář

20.5.2018 17:45 /Redakce Linuxsoft.cz
Ve čtvrtek 31. května 2018 připravuje webový magazín BusinessIT ve spolupráci s Best Online Média s.r.o. pátý ročník odborné konference Firemní informační systémy 2018. Akce proběhne v kongresovém centru Vavruška (palác Charitas), Karlovo náměstí 5, Praha 2 (u metra Karlovo náměstí) od 9:00 hod. dopoledne do cca 15 hod. odpoledne. Konference je zaměřena na efektivní využití firemních informačních systémů a na to, jak plně využít jejich potenciál. Podrobnější informace na webových stránkách konfrence.
Přidat komentář

14.5.2018 7:28 /František Kučera
Květnový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 17. 5. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát na téma: Audio – zvuk v GNU/Linuxu.
Přidat komentář

7.5.2018 16:20 /František Kučera
Na stránkách spolku OpenAlt vyšla fotoreportáž Pražské srazy 2017 dokumentující srazy za uplynulý rok. Květnový pražský sraz na téma audio se bude konat 17. 5. 2018 (místo a čas ještě upřesníme).
Přidat komentář

17.4.2018 0:46 /František Kučera
Dubnový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 19. 4. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tématem tohoto srazu bude OpenStreetMap (OSM) aneb svobodné mapy.
Přidat komentář

16.3.2018 22:01 /František Kučera
Kulatý OpenAlt sraz v Praze oslavíme klasicky: u limonády a piva! Přijďte si posedět, dát si dobré jídlo a vybrat z mnoha piv do restaurace Kulový blesk, který najdete v centru Prahy nedaleko metra I. P. Pavlova na adrese Sokolská 13, Praha 2. Sraz se koná ve čtvrtek 22. března a začínáme v 18:00. Heslo: OpenAlt. Vezměte s sebou svoje hračky! Uvítáme, když si s sebou na sraz vezmete svoje oblíbené hračky. Jestli máte nějaký drobný projekt postavený na Arduinu, nějakou zajímavou elektronickou součástku, či třeba i pěkný úlovek z crowdfundingové akce, neváhejte. Oslníte ostatní a o zábavu bude postaráno.
Přidat komentář

13.2.2018 0:41 /František Kučera
Únorový pražský sraz OpenAltu se koná 15. 2. 2018 a tentokrát se vydáme na návštěvu do jednoho pražského datacentra. Sejdeme se v 17:50 v severovýchodní části nástupiště tramvajové zastávky Koh-I-Noor. Po exkurzi se přesuneme do restaurace U Pštrosa (Moskevská 49), kde probereme tradiční témata (svobodný software a hardware, DIY, CNC, SDR, 3D tisk…) a tentokrát bude k vidění i IoT brána od The Things Network.
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

20.2.2018 18:48 / Ivan Majer
portal

20.2.2018 15:57 / Jan Havel
Jak využíváte služby cloudu v podnikání?

16.1.2018 1:08 / Ivan Pittner
verejna ip od o2 ubuntu

15.1.2018 17:26 / Mira Harvalik
Re: Jak udělat HTML/Javascript swiping gallery do mobilu?

30.12.2017 20:16 / Michal Knoll
odmocnina

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2018) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze