MS Office week
Pouze tento týden sleva až 80 % na e-learning týkající se MS Office
50 % bodů zdarma na online výuku díky naší Slevové akci!

Přechod od C k C++

Jazyky C a C++ jsou si velmi blízké. Může nás až překvapit, že každý program, který lze zkompilovat pomocí C kompileru lze současně zkompilovat i pomocí C++ kompileru. Nicméně je zde několik věcí, které se v C++ píší jinak. Možná vás nyní napadne, že si vlastně protiřečím. Když se něco píše jinak, nemůže to být přeci kompatibilní. Ve skutečnosti jazyk C++ zpětně podporuje jazyk C a jak si řekneme, poskytuje pouze další syntaxi pro ulehčení práce.

Kompatibilita

V úvodu jsem zmínil, že každý program, který lze zkompilovat C kompilerem, je i validní C++ program. Abychom tvrzení upřesnili, řekněme si, že C++ zakazuje několik málo (a přesně popsaných) případů, které kompilátor C povoluje. Nemusíte se ale děsit. Vývojáři C++ se k tomuto kroku uchýlili, protože C podporuje operace, jejichž výsledek není na první pohled úplně zřejmý. Píšete-li program slušně, nemusíte se ničeho bát. Pro úplnost pouze v bodech vypíšu rozdíly, tedy konstrukce, které v C++ nejsou povoleny, ale v C fungují bez problémů.

  • Implicitní konverze z ukazatele typu void na libovolný jiný ukazatel.
void* ptr;
int* num = ptr;
  • Nová klíčová slova jazyka C++ (template, new, delete, class a další)
  • Zákaz příkazu goto nebo switch na přeskočení deklarace proměnné.
goto navesti;
int variable;
navesti:
//zbytek programu
  • Opakovaná deklarace globální proměnné.
  • U funkce, která nepřijímá žádný parametr, se muselo uvádět do parametru void. Nebylo-li uvedeno, C předpokládalo, že počet parametrů je proměnlivý. V C++ se void uvádět nemusí a funkce nesmí přijímat žádný parametr.
  • Konstantní hodnoty bere C++ striktněji než C.
  • Standard C99 a C11 přidal do C několik věcí, které nejsou ve standardu C++. To ale neznamená, že je kompilery nepodporují!

Proč jsme se vlastně učili C?

V první řadě je C vhodnější na systémové programování. C++ dovoluje přetížení metod. Téma bude probráno v sérii o C++, ale ve zkratce se jedná o to, že můžeme mít několik funkcí se stejným názvem, ale různými parametry. Menší příklad:

int secti(int scitanec)
{
     return scitanec+scitanec;
}
int secti(int prvniScitanec, int druhyScitanec)
{
     return prvniScitanec+druhyScitanec;
}

Aby kompiler funkce mezi sebou rozpoznal, provádí tzv. name mangling. Interně přidá různé předpony na základě hlavičky funkce. To znamená, že neznáme skutečné jméno funkce až do doby, než kompiler k funkci dojde. C name mangling nedělá a tak můžeme například z assembleru volat přímo C funkce. Je tu ale ještě jedna věc, která je mnohem důležitější.

Protože jsou si jazyky tak podobné, většina knihoven je napsána pro C. Je to pochopitelné, proč bychom měli psát tu stejnou knihovnu 2x - jednou pro C a jednou pro C++, když můžeme vzít knihovnu z C a bez problémů ji použít v C++. Céčko tedy bohatě využijete i v C++.

Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

Právě z tohoto důvodu doporučuji naučit se nejdříve C a následně přejít na C++. To říkám jako někdo, kdo již v C++ dělá několik let. Přechod z C na C++ je naprosto bezproblémový. Všechny změny, které jsou v C++, popíši právě v tomto článku.

Jak tedy začít s C++?

Nejdříve budeme potřebovat IDE pro vývoj. Buďto můžete pokračovat s NetBeans nebo si můžete stáhnout Visual Studio (doporučeno) či Eclipse. Instalace Visual Studia je popsána ve druhé lekci kurzu základních konstrukcí C++.

Dále si přečtěte zbytek rozdílů, které se v C++ vyskytují. Některá témata odkazují přímo na lekce z kurzu programování v C++. Jedná se o témata, která se v C++ změnila více a nezvládl bych je zde popsat v pár odstavcích. Zmíněné lekce budou jediné potřebné materiály. Po jejich přečtení můžete přeskočit celé základy a přejít rovnou na objektově orientovaného programování v C++.

Správa paměti

C a C++ má rozdílnou správu paměti. Z céčka známe funkce malloc() a free(). Malloc() nám alokovalo místo na haldě, zatímco free() paměť uvolnilo. C++ zavádí nová klíčové slova "new" a "delete", která slouží ke stejnému účelu. Hned na úvod důležité upozornění: přístupy nelze kombinovat!! Paměť vytvořenou pomocí syntaxe C++ (tedy pomocí new) nelze uvolnit voláním funkce free(). Stejně tak je tomu obráceně, paměť získanou z funkce malloc() nelze uvolnit pomocí delete! Než abych zde popisoval syntaxi a vše okolo, přesměruji vás na díl přímo k tomu určený. Nejdříve je to článek Dynamická správa paměti v C++. Obsahem kopíruje obsah stejného článku v C, ale používá již novou syntaxi pro alokování prostředků. Dále C++ zavádí nový "typ" - referenci. Ten je probrán v článku Reference v C++.

Vstup a výstup

C++ používá pro vstup a výstup objekty. Že zatím nevíte, co to objekty jsou, vůbec nevadí. Jednoduše si pouze pročtěte první článek Hello World v C++ a článek o validaci vstupů od uživatele. Podrobnější popis bude až po probrání principů OOP.

Možnosti funkcí

C++ má na rozdíl od C větší možnosti, jak může s funkcemi pracovat. Můžeme mít například více funkcí se stejným názvem ale jinými parametry. Kompilátor si poté sám vybere, která funkce se k parametrům nejvíce hodí. Těmto změnám je věnován celý díl přetěžování a statika u funkcí

Práce s řetězci

Pro text má C++ samostatný typ: string. Může obsahovat text libovolné délky. Spojování probíhá přirozeně pomocí znaménka +. Nenechte se ale zmást, opět se jedná pouze o objekt, který interně dynamicky spravuje pole charů, tak jak to známe z jazyka C. Opět pouze přesměruji na díl Řetězce v C++.

Definice struktur

V C jsme psali u struktur konstrukci typedef. Tím jsme zajistili, že nemusíme v kódu opakovaně psát informaci, že se jedná o strukturu. C++ přidává typedef implicitně, stačí tedy uvést pouze jméno struktury. Ta stejná pravidla platí pro všechny výskyty typedef, které jsme v C používali (například enumy).

struct osoba
{
    int vek;
        int vyska;
}
int main()
{
    osoba karel;
    //.....
}

Knihovny

V céčku jsme probrali velké množství knihoven. Pozitivní informací je, že je můžeme bez problémů použít i v C++. Pokud budeme psát názvy knihoven stejným způsobem, jakým jsme to psali do teď, nic se neděje. Program bude fungovat správně a kompiler s tím nebude mít nejmenší problém. Nicméně pro C++ se zavádí nové názvy, které mají před svým názvem předponu "c" a je odstraněna koncovka ".h". Ale jak jsem řekl, změna není vyžadována a fungují oba přístupy.

#include <stdlib.h>
#include <cstdlib> // ekvivalentní zápis

Dopředná inicializace proměnných

V céčku je zvykem všechny proměnné nadeklarovat na začátku funkce nebo bloku kódu. Správně by céčko ani nemělo povolit následující zápis:

for(int i=0;....)

Podle standardů C by měla být proměnná i nadefinovaná před začátkem for cyklu. V C++ toto omezení neplatí a proměnné mohou být deklarovány kdekoliv během provádění bloku kódu. Samozřejmě musí být proměnná stále deklarována před jejím použitím, jinak překladač zahlásí chybu.

Tím jsme ukončili tento krátký článek, který se zabýval rozdíly mezi C a C++. Nyní můžete přeskočit rovnou na OOP v C++.


 

Všechny články v sekci
Online kurzy programování v C++ - Největší český e-learning
Článek pro vás napsal Patrik Valkovič
Avatar
Jak se ti líbí článek?
3 hlasů
Věnuji se programování v C++ a C#. Kromě toho také programuji v PHP (Nette) a JavaScriptu (NodeJS).
Aktivity (10)

 

 

Komentáře

Avatar
Nositelka Změny:19. ledna 14:47

Je vlastně vůbec nějaký důvod, proč dneska ještě používat C? C++ nemá v podstatě žádné omezení oproti C až na řídké výjimky, se kterými se nikdo nikdy nesetká, protože se již ani v C dávno nepoužívají. A protože se oba jazyky kompilují až na šrot (tedy do strojového kódu), tak vzniklý program bude stejně rychlý. Jenom ta kompilace bude pomalejší, ale to nikomu nevadí, protože C++ obsahuje tólik nových možností, že se za to vyplatí něco obětovat.

Odpovědět
19. ledna 14:47
j.k.j
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Nositelka Změny
David Čápka:19. ledna 16:43

V céčku je vytvořeno hodně velkých projektů, které už nikdo přepisovat nebude (hlavně jádro Linuxu a nebo třeba programovací jazyk PHP), což je důvod, proč se ještě používá. Jinak máš pravdu, že dělat nové projekty v céčku moc nedává smysl.

Odpovědět
19. ledna 16:43
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Nositelka Změny
Martin Dráb:19. ledna 16:58

Pořád ještě existují místa, kde je C v zásadě preferováno, protože běhové prostředí tam prostě neumožňuje C++ plně využít.

I jádro Windows je z drtivé většiny napsáno v C a ovladače se často v tomto jazyce píší dodnes. Pravda, některé prvkyz C++ se využívají (třídy, jmenné prostory, virtuální metody), ale celkem v omezeném rozsahu. Díky nim je kód o něco přehlednější. V jádru například příliš nefunguje obsluha výjimek (existuje, ale jen za určitých okolností) a situace, kdy selže alokace, protože není dostatek paměti, patří mezi naprosto validní stavy (což C++ moc neřeší). Také je tu samozřejmě argument, že programování v jádře je samo o sobě dost složité, takže není úplně žádoucí jej ještě ztěžovat použitím složitého jazyka.

Pak tu máme samozřejmě mikrokontrolery a la Arduino. Jistě, spousta C++ knihoven zde existuje, ale pokud opravdu chceš využít jejich omezené prostředky efektivně,těmto knihovnám se vyhneš. To tedy platí i pro "dospělé" počítače – ač jeho překladač opravdu optimalizuje, co se dá, pořád je velikost výsledné binárky vyšší než u C.

Odpovědět
19. ledna 16:58
2 + 2 = 5 for extremely large values of 2
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Patrik Valkovič:19. ledna 17:07

Naopak bych řekl, že je C obecně preferovanější pro knihovny. C lze totiž snadno napojit na libovolný programovací jazyk. To v C++ není možné, protože ve výsledné knihovně není známý přesný název funkce (tedy je, ale až po kompilaci) - viz name mangling. Takže bych naopak řekl, že se knihovny píší v C++ a popřípadě se nad nimi postaví C++ wrapper (a stejně jednoduše wrapper na libovolný jiný jazyk).

Odpovědět
19. ledna 17:07
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Nositelka Změny
DarkCoder:19. ledna 17:36

Je vlastně vůbec nějaký důvod, proč dneska ještě používat C?

For infrastructure technology, C will be hard to displace. - Dennis Ritchie

Jazyk C umožňuje a poskytuje způsob, jak řešit to co jiné jazyky nedokáží. Elegantně a efektivně. Jazyk C je nesrovnatelně jednodušší a přímočařejší nežli C++. Pomáhá programátorovi pochopit co a jak funguje a udržuje ho v pozornosti. Díky tomu dává programátorovi schopnost snáze řešit úlohy. Ano, použití ukazatelů je efektivní stejně jako nebezpečné. To je zkrátka cena efektivity, ale stojí to za to. Chceme-li udržovat nebo vylepšovat cokoli na úrovni jádra, bez C se neobejdeme. C je také v mnoha ohledech lepší než a rychlejší než C++. C je branou k ostatním programovacím jazykům.

A že jazyk C vznikl v 80. letech minulého století neznamená, že je zastaralý a nepoužitelný. Jazyk C se stále vyvijí (viz. standarty C89, C90, C95, C99, C11 a zatím poslední C18) a přizpůsobuje se moderním stylům a požadavkům. V C se používá víceméně vše od jeho vzniku, snad jen parametrizovaná makra jsou od C99 nahrazena inline modifikátorem z důvodu jednoduchosti. Nicméně zůstávají stále v platnosti.

Odpovědět
19. ledna 17:36
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Avatar
Atrament
Super redaktor
Avatar
Odpovídá na DarkCoder
Atrament:19. ledna 20:17

C vzniklo v roce 1972, to jenom pro upřesnění...

 
Odpovědět
19. ledna 20:17
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.