<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://www.multimediaexpo.cz/mmecz/skins/common/feed.css?270"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="cs">
		<id>http://www.multimediaexpo.cz/mmecz/index.php?action=history&amp;feed=atom&amp;title=Preprocesor_jazyka_C</id>
		<title>Preprocesor jazyka C - Historie editací</title>
		<link rel="self" type="application/atom+xml" href="http://www.multimediaexpo.cz/mmecz/index.php?action=history&amp;feed=atom&amp;title=Preprocesor_jazyka_C"/>
		<link rel="alternate" type="text/html" href="http://www.multimediaexpo.cz/mmecz/index.php?title=Preprocesor_jazyka_C&amp;action=history"/>
		<updated>2026-07-31T06:25:21Z</updated>
		<subtitle>Historie editací této stránky</subtitle>
		<generator>MediaWiki 1.16.5</generator>

	<entry>
		<id>http://www.multimediaexpo.cz/mmecz/index.php?title=Preprocesor_jazyka_C&amp;diff=324187&amp;oldid=prev</id>
		<title>Sysop: 1 revizi</title>
		<link rel="alternate" type="text/html" href="http://www.multimediaexpo.cz/mmecz/index.php?title=Preprocesor_jazyka_C&amp;diff=324187&amp;oldid=prev"/>
				<updated>2013-09-20T07:41:55Z</updated>
		
		<summary type="html">&lt;p&gt;1 revizi&lt;/p&gt;
&lt;table style=&quot;background-color: white; color:black;&quot;&gt;
		&lt;tr valign='top'&gt;
		&lt;td colspan='1' style=&quot;background-color: white; color:black;&quot;&gt;← Starší verze&lt;/td&gt;
		&lt;td colspan='1' style=&quot;background-color: white; color:black;&quot;&gt;Verze z 20. 9. 2013, 07:41&lt;/td&gt;
		&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Sysop</name></author>	</entry>

	<entry>
		<id>http://www.multimediaexpo.cz/mmecz/index.php?title=Preprocesor_jazyka_C&amp;diff=324186&amp;oldid=prev</id>
		<title>Sysop: 1 revizi</title>
		<link rel="alternate" type="text/html" href="http://www.multimediaexpo.cz/mmecz/index.php?title=Preprocesor_jazyka_C&amp;diff=324186&amp;oldid=prev"/>
				<updated>2010-10-21T17:20:28Z</updated>
		
		<summary type="html">&lt;p&gt;1 revizi&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nová stránka&lt;/b&gt;&lt;/p&gt;&lt;div&gt;'''Preprocesor jazyka C''' (anglicky: ''The C preprocessor'', zkratka ''cpp'') je v [[Informatika (počítačová věda)|informatice]] [[preprocesor]] používaný zejména při překladu zdrojových kódů programů napsaných v [[C (programovací jazyk)|jazyce C]]. V mnoha implementacích se jedná o samostatný program spouštěný [[překladač]]em v rámci první fáze překladu. Preprocesor interpretuje jednoduché [[direktiva|direktivy]] pro vložení zdrojového kódu z jiného souboru (&amp;lt;code&amp;gt;#include&amp;lt;/code&amp;gt;), definice [[makro (software)|maker]] (&amp;lt;code&amp;gt;#define&amp;lt;/code&amp;gt;) a podmíněné vložení kódu (&amp;lt;code&amp;gt;#if&amp;lt;/code&amp;gt;). Jazyk direktiv preprocesoru není vázán na syntaxi jazyka C, takže preprocesor C lze využít i na zpracování jiných typů souborů.&lt;br /&gt;
&lt;br /&gt;
== Fáze překladu zdrojového kódu v C ==&lt;br /&gt;
# Nahrazení trigramů (v podstatě jde o [[escape sekvence]], které umožňují zadávání potřebných 7-bit [[ASCII]] znaků i z jiných, většinou starších kódových tabulek).&lt;br /&gt;
# Spojení řádků – fyzické řádky zdrojového textu, které jsou zakončeny escape-sekvencí nového řádku (v podstatě jde o obrácené lomítko \ použité jako poslední znak na řádku), jsou spojeny do jediného logického řádku.&lt;br /&gt;
# Tokenizace – preprocesor zalomí výsledek do posloupnosti tzv. ''tokenů preprocesoru'' a ''bílých znaků'' (mezery, tabelátory a konce řádků). Komentáře jsou nahrazeny ''bílým znakem''. &lt;br /&gt;
# Přepsání maker a provedení direktiv - v této fázi jsou expandována makra a provedeny direktivy, jako např. vložení zdrojového kódu z jiného souboru nebo vynechání části zdrojového kódu v případě podmíněného překladu.&lt;br /&gt;
&lt;br /&gt;
== Direktivy preprocesoru ==&lt;br /&gt;
=== Vkládání souborů ===&lt;br /&gt;
Nejčastěji využívanou direktivou preprocesoru je vložení jiného souboru:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
    printf(&amp;quot;Hello, world!\n&amp;quot;);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
V tomto případě direktiva &amp;lt;code&amp;gt;#include&amp;lt;/code&amp;gt; vložila na začátek zdrojového souboru obsah souboru &amp;lt;code&amp;gt;stdio.h&amp;lt;/code&amp;gt;, který musí být v systému uložen ve specifickém adresáři (v [[UN*X|unixových systémech]] v adresáři &amp;lt;code&amp;gt;/usr/include&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Podmíněný překlad ===&lt;br /&gt;
Direktivy &amp;lt;code&amp;gt;#if&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;#ifdef&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;#ifndef&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;#else&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;#elif&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;#endif&amp;lt;/code&amp;gt; umožňují podmíněný překlad vybraných částí zdrojového kódu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define __WINDOWS__&lt;br /&gt;
&lt;br /&gt;
#ifdef __WINDOWS__&lt;br /&gt;
#include &amp;lt;windows.h&amp;gt;&lt;br /&gt;
#else&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Symbol není nutné definovat ve zdrojovém kódu, jako je tomu v předcházejícím příkladě s &amp;lt;code&amp;gt;#define __WINDOWS__&amp;lt;/code&amp;gt;, ale lze jej definovat až při překladu jako jeden z atributů preprocesoru, popřípadě kompilátoru. Viz následující příklad:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
#ifdef CZ   &lt;br /&gt;
    printf(&amp;quot;Ahoj\n&amp;quot;);&lt;br /&gt;
#else&lt;br /&gt;
    printf(&amp;quot;Hello\n&amp;quot;);&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Při překladu pak použijeme:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$gcc -Wall ahoj.c -o ahoj&lt;br /&gt;
$./ahoj&lt;br /&gt;
Hello&lt;br /&gt;
&lt;br /&gt;
$gcc -Wall ahoj.c -DCZ -o ahoj&lt;br /&gt;
$./ahoj&lt;br /&gt;
Ahoj&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Poprvé je soubor s kompilován bez definovaného symbolu &amp;lt;code&amp;gt;CZ&amp;lt;/code&amp;gt; a v kódu bude tedy použit řádek &amp;lt;code&amp;gt;printf(&amp;quot;Hello\n&amp;quot;);&amp;lt;/code&amp;gt;. V druhém případě je jedním z parametrů při volání kompilátoru &amp;lt;code&amp;gt;-DCZ&amp;lt;/code&amp;gt;, takže symbol &amp;lt;code&amp;gt;CZ&amp;lt;/code&amp;gt; bude nadefinován ještě před spuštěním preprocesoru a v kódu se proto použije řádek &amp;lt;code&amp;gt;printf(&amp;quot;Ahoj\n&amp;quot;);&amp;lt;/code&amp;gt;. Následující příkaz &amp;lt;code&amp;gt;./ahoj&amp;lt;/code&amp;gt; spouští překompilovaný soubor.&lt;br /&gt;
&lt;br /&gt;
Podmíněný překlad se často používá k tomu, aby zabránil vícenásobnému vložení téhož kódu. Následující příklad zajistí, že kód bude vložen pouze jednou, bez ohledu na to, kolikrát bude direktivou &amp;lt;code&amp;gt;#include&amp;lt;/code&amp;gt; vložen soubor, který jej obsahuje. Konstrukce je užitečná při tvorbě složitějších programů, složených z mnoha souborů:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef SOUBOR_A&lt;br /&gt;
#define SOUBOR_A&lt;br /&gt;
...&lt;br /&gt;
kód&lt;br /&gt;
...&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Definice a expanze maker ===&lt;br /&gt;
Používají se dva základní typy definice maker. Jednak lze definovat makra bez parametru, která expandují vždy do stejné sekvence znaků (resp. tokenů), jednak lze definovat makra s parametry, které se z praktického hlediska chovají podobně jako [[Funkce (programování)|funkce]]. Obecná syntaxe direktivy &amp;lt;code&amp;gt;#define&amp;lt;/code&amp;gt; je:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define &amp;lt;identifikátor&amp;gt; &amp;lt;seznam nahrazujících tokenů&amp;gt;&lt;br /&gt;
#define &amp;lt;identifikátor&amp;gt;(&amp;lt;seznam parametrů&amp;gt;) &amp;lt;seznam nahrazujících tokenů&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Speciálním případem je definice samotného identifikátoru, kterému není přiřazen žádný další seznam tokenů – příklad použití takovéto definice byl uveden v sekci ''Podmíněný překlad''. &lt;br /&gt;
&lt;br /&gt;
Příkladem makra, které nepřijímá žádné parametry, může být následující použití preprocesoru k definici číselné konstanty:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define PI 3.14159&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Příkladem makra, které přijímá parametr (argument):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define RADTODEG(x) ((x) * 57.29578)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Při použití takto definovaného makra se nesmí mezi názvem makra a závorkou, ve které je uveden jeden nebo více parametrů (argumentů), vyskytovat žádné bílé znaky (tj. nesmí tam být uvedena mezera).&lt;br /&gt;
&lt;br /&gt;
Specifickým rysem maker C preprocesoru z hlediska programování v jazyce C je to, že jde pouze o zestručněný zápis zdrojového kódu (podobně jako v případě některých skriptovacích jazyků) – nikoliv o skutečnou definici funkce. Proto parametry maker nepodléhají [[Typová kontrola|typové kontrole]] jazyka C. Tento zápis se nechová jako funkce a někdy to může vést k obtížně odhalitelným chybám. Například v tomto případě, kde je makro &amp;lt;code&amp;gt;NASOBEK&amp;lt;/code&amp;gt; definováno takto:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define NASOBEK(a,b) a*b&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
a je použité ve výrazu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
c=NASOBEK(2+2,5+5)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
bude expandováno jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
c=2+2*5+5&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Výsledek není mylně očekávaných 40 ale 17. Takové chybě se dá v tomto konkrétním případě zabránit uzavřením matematického výrazu do závorek (podobně jako u ukázkového makra &amp;lt;code&amp;gt;RADTODEG(x)&amp;lt;/code&amp;gt; v předchozím příkladu). Obecným řešením je nepoužívání nadměrně komplikovaných maker. V tomto konkrétním případě stačí dané makro přepsat jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define NASOBEK(a,b) ((a)*(b))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Obtížněji řešitelným problémem je tzv. vícenásobná evaluace (vyhodnocení) parametrů makra – pokud je parametrem makra např. volání funkce, tak na rozdíl od obyčejného volání funkce, kdy by byla funkce zavolána jen jednou a pak se pracovalo s její návratovou hodnotu, je v případě makra funkce zavolána pokaždé, když se definice makra odkazuje na daný parametr. Kromě volání funkcí je toto chování nepříjemné např. i při použití specifických C operátorů jako &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;−−&amp;lt;/code&amp;gt; apod.&lt;br /&gt;
&lt;br /&gt;
Pokud je to potřeba, lze definici makra zrušit (odstraňuje makra s parametry i makra bez parametru):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#undef &amp;lt;identifikátor&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ustálené zvyklosti ===&lt;br /&gt;
Existuje nezávazná konvence využití dostupného prostoru jmen, podle které jsou v názvech maker preprocesoru jazyka C vždy používána pouze velká písmena A-Z (spolu s číslicemi a podtržítky), zatímco názvy funkcí a proměnných v C jsou obvykle tvořená pouze malými písmeny a-z (spolu s číslicemi a podtržítky, někdy je použita kombinace velkých a malých písmen). Nicméně jde pouze o konvenci usnadňující čtení zdrojového kódu: lze použít i názvy maker tvořené malými písmeny nebo kombinací velkých a malých písmen (stejně tak lze pojmenovat funkce a proměnné v C naopak velkými písmeny).&lt;br /&gt;
&lt;br /&gt;
== Související články ==&lt;br /&gt;
* [[Preprocesor]]&lt;br /&gt;
&lt;br /&gt;
{{Článek z Wikipedie}}&lt;br /&gt;
[[Kategorie:Počítačové jazyky]]&lt;/div&gt;</summary>
		<author><name>Sysop</name></author>	</entry>

	</feed>