<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ro">
	<id>http://wiki.dcae.pub.ro/index.php?action=history&amp;feed=atom&amp;title=PC_Laborator_3.1_%28op%C8%9Bional%29</id>
	<title>PC Laborator 3.1 (opțional) - Revizia istoricului</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.dcae.pub.ro/index.php?action=history&amp;feed=atom&amp;title=PC_Laborator_3.1_%28op%C8%9Bional%29"/>
	<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_3.1_(op%C8%9Bional)&amp;action=history"/>
	<updated>2026-05-28T18:37:03Z</updated>
	<subtitle>Istoricul versiunilor pentru această pagină din wiki</subtitle>
	<generator>MediaWiki 1.35.14</generator>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_3.1_(op%C8%9Bional)&amp;diff=5573&amp;oldid=prev</id>
		<title>Rhobincu: /* Obiective */</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_3.1_(op%C8%9Bional)&amp;diff=5573&amp;oldid=prev"/>
		<updated>2017-10-29T21:41:46Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Obiective&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left diff-editfont-monospace&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ro&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Versiunea anterioară&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Versiunea de la data 29 octombrie 2017 21:41&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot; &gt;Linia 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Linia 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Obiective =&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Obiective =&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt;−&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;În urma parcurgerii acestui laborator studentul va fi capabil&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;:&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;În urma parcurgerii acestui laborator studentul va fi capabil să înțeleagă funcționalitatea preprocesorului și să folosească directive de preprocesare&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt;−&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;* să utilizeze stream-urile standard ale unui proces în Linux și în programe C;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt;−&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;* &lt;/del&gt;să înțeleagă funcționalitatea preprocesorului și să folosească directive de preprocesare&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= [https://en.wikipedia.org/wiki/C_preprocessor Preprocesorul C] =&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= [https://en.wikipedia.org/wiki/C_preprocessor Preprocesorul C] =&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Rhobincu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_3.1_(op%C8%9Bional)&amp;diff=5572&amp;oldid=prev</id>
		<title>Rhobincu: Pagină nouă: = Obiective =  În urma parcurgerii acestui laborator studentul va fi capabil: * să utilizeze stream-urile standard ale unui proces în Linux și în programe C; * să înțeleag...</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_3.1_(op%C8%9Bional)&amp;diff=5572&amp;oldid=prev"/>
		<updated>2017-10-29T21:41:24Z</updated>

		<summary type="html">&lt;p&gt;Pagină nouă: = Obiective =  În urma parcurgerii acestui laborator studentul va fi capabil: * să utilizeze stream-urile standard ale unui proces în Linux și în programe C; * să înțeleag...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Pagină nouă&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Obiective =&lt;br /&gt;
&lt;br /&gt;
În urma parcurgerii acestui laborator studentul va fi capabil:&lt;br /&gt;
* să utilizeze stream-urile standard ale unui proces în Linux și în programe C;&lt;br /&gt;
* să înțeleagă funcționalitatea preprocesorului și să folosească directive de preprocesare;&lt;br /&gt;
&lt;br /&gt;
= [https://en.wikipedia.org/wiki/C_preprocessor Preprocesorul C] =&lt;br /&gt;
&lt;br /&gt;
Preprocesarea unui fișier cu cod C este prima etapă din lanțul de &amp;#039;&amp;#039;build&amp;#039;&amp;#039;, și reprezintă, așa cum îi spune și numele, o etapă de dinainte de procesarea (compilarea) efectivă. Motivul pentru care se realizează această etapă inițială este faptul că prin preprocesarea codului se pot elimina secțiuni din program care ori nu sunt necesare, ori nu sunt compilabile pe un anumit procesor sau sistem de operare. Spre exemplu, pentru a folosi o interfață serială, în sistemul de operare Windows, și compilatorul Visual Studio, există un tip de date care se numește &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;HANDLE&amp;lt;/code&amp;gt;. Acest tip de date nu există în Linux, aici fiind înlocuit simplu cu &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;int&amp;lt;/code&amp;gt;. În acest caz, compilarea unui program care folosește &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;HANDLE&amp;lt;/code&amp;gt; pe Linux va eșua cu eroare. Aici intervin directivele de preprocesare, după cum vom vedea în continuare.&lt;br /&gt;
&lt;br /&gt;
În acest laborator se va discuta despre:&lt;br /&gt;
* &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#include&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#define&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#undef&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#ifdef&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#ifndef&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#else&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#endif&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Directiva &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#include&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
Probabil &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#include&amp;lt;/code&amp;gt; este cea mai frecvent utilizată directivă de preprocesare, dar și cea mai ușor de înțeles. Efectiv, preprocesorul caută fișierul specificat între paranteze unghiulare sau ghilimele în lista de directoare dintr-o listă cunoscută și apoi înlocuiește directiva &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#include&amp;lt;/code&amp;gt; cu conținutul fișierului respectiv.&lt;br /&gt;
&lt;br /&gt;
=== Exemplu ===&lt;br /&gt;
&lt;br /&gt;
* Scrieți un fișier nou într-un editor de text care să conțină următorul cod:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Salvați fișierul cu numele &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;test_preprocessor.c&amp;lt;/code&amp;gt; în directorul &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;~/work/&amp;#039;&amp;#039;prenume_nume&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Scrieți un fișier &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;Makefile&amp;lt;/code&amp;gt; cu o singură rețetă care să producă un fișier numit &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;processed.c&amp;lt;/code&amp;gt; din fișierul de mai sus, apelând compilatorul C (gcc) cu fanionul corespunzător pentru a face doar preprocesare (vezi [[PC Laborator 1#Generarea fișierului executabil|PC Laborator 1]]).&lt;br /&gt;
* Ce diferențe există între fișierul original și fișierul preprocesat?&lt;br /&gt;
* Scrieți un nou fișier numit &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;header_file.h&amp;lt;/code&amp;gt;, care să conțină următorul text:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
// This is the start of the header file&lt;br /&gt;
int variable;&lt;br /&gt;
// This is the end of the header file&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Modificați fișierul &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;test_preprocesor.c&amp;lt;/code&amp;gt; prin înserția pe prima linie a unei directive &amp;#039;&amp;#039;&amp;#039;include&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;header_file.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Rulați din nou comanda &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;make&amp;lt;/code&amp;gt;. Observați mesajul de eroare: fișierul &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;header_file.h&amp;lt;/code&amp;gt; nu este găsit de preprocesor, cu toate că este în directorul curent.&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Atenție:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Fișierele antet (header) sunt căutate doar în anumite căi predefinite în compilator (de exemplu &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;/usr/include&amp;lt;/code&amp;gt;). Pentru a face preprocesorul să caute și în alte directoare, calea până la acestea trebuie specificată la compilare, folosind fanionul &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;-I&amp;lt;/code&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
* Adăugați comenzii de compilare din &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;Makefile&amp;lt;/code&amp;gt; următorul fanion: &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;-I.&amp;lt;/code&amp;gt; Asta va spune compilatorului (care mai departe va spune preprocesorului) să caută fișiere antet și în directorul curent (.)&lt;br /&gt;
* Rulați din nou comanda &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;make&amp;lt;/code&amp;gt;. &lt;br /&gt;
* Afișați conținutul celor două fișiere C. Ce diferențe observați?&lt;br /&gt;
&lt;br /&gt;
== Directivele &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#define&amp;lt;/code&amp;gt; și &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#undef&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
Directiva &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#define&amp;lt;/code&amp;gt; este utilizată pentru a defini &amp;#039;&amp;#039;&amp;#039;macro&amp;#039;&amp;#039;&amp;#039;-uri de preprocesor. Acestea se folosesc în trei feluri distincte:&lt;br /&gt;
* &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#define &amp;#039;&amp;#039;token&amp;#039;&amp;#039; &amp;#039;&amp;#039;value&amp;#039;&amp;#039;&amp;lt;/code&amp;gt; - este definit &amp;#039;&amp;#039;&amp;#039;macro&amp;#039;&amp;#039;&amp;#039;-ul &amp;#039;&amp;#039;token&amp;#039;&amp;#039; existența acestuia putând fi testată cu directivele &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#ifdef&amp;lt;/code&amp;gt; și &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#ifndef&amp;lt;/code&amp;gt;; dacă &amp;#039;&amp;#039;token&amp;#039;&amp;#039; este utilizat în program, după definirea lui, el va fi înlocuit cu &amp;#039;&amp;#039;value&amp;#039;&amp;#039; (efectiv, această operație este identică cu un &amp;quot;Search and Replace&amp;quot; dintr-un editor de text, unde &amp;#039;&amp;#039;token&amp;#039;&amp;#039; este înlocuit cu &amp;#039;&amp;#039;value&amp;#039;&amp;#039;.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#define PI 3.1415&lt;br /&gt;
&lt;br /&gt;
float a = 2 * PI;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#define &amp;#039;&amp;#039;token&amp;#039;&amp;#039;&amp;lt;/code&amp;gt; - este definit &amp;#039;&amp;#039;&amp;#039;macro&amp;#039;&amp;#039;&amp;#039;-ul &amp;#039;&amp;#039;token&amp;#039;&amp;#039;, existența acestuia putând fi testată cu directivele &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#ifdef&amp;lt;/code&amp;gt; și &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#ifndef&amp;lt;/code&amp;gt;; dacă &amp;#039;&amp;#039;token&amp;#039;&amp;#039; este utilizat în program, după definirea lui, va fi șters de peste tot unde apare (este de fapt cazul de mai sus unde &amp;#039;&amp;#039;value&amp;#039;&amp;#039; este de fapt un string de lungime zero).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#define DEBUG&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
#ifdef DEBUG&lt;br /&gt;
    printf(&amp;quot;Debug is ON!\n&amp;quot;);&lt;br /&gt;
#endif&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#define &amp;#039;&amp;#039;token(arg1,arg2,..) expression&amp;#039;&amp;#039;&amp;lt;/code&amp;gt; - este definit &amp;#039;&amp;#039;&amp;#039;macro&amp;#039;&amp;#039;&amp;#039;-ul &amp;#039;&amp;#039;token&amp;#039;&amp;#039;, existența acestuia putând fi testată cu directivele &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#ifdef&amp;lt;/code&amp;gt; și &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#ifndef&amp;lt;/code&amp;gt;; &amp;#039;&amp;#039;token&amp;#039;&amp;#039; este utilizat în program ca o funcție, iar el va fi înlocuit de &amp;#039;&amp;#039;expression&amp;#039;&amp;#039;, în care &amp;#039;&amp;#039;arg1,arg2,...&amp;#039;&amp;#039; vor fi înlocuite cu valorile din program.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#define MAX(a,b) (a &amp;lt; b ? b : a)&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    printf(&amp;quot;Value is %d!\n&amp;quot;, MAX(4,5)); // Replaced to: printf(&amp;quot;Value is %d!\n&amp;quot;, (4 &amp;lt; 5 ? 5 : 4));&lt;br /&gt;
//  printf(&amp;quot;Value is %d!\n&amp;quot;, MAX(4 + 1, 5 + 1)); // Replaced to: printf(&amp;quot;Value is %d!\n&amp;quot;, (4 + 1 &amp;lt; 5 + 1 ? 5 + 1 : 4 + 1));&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Atenție:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; O greșeală frecventă în definirea macrourilor este adăugarea unui caracter ; la sfârșitul liniei. Acesta se va înlocui și el în momentul în care &amp;#039;&amp;#039;&amp;#039;macro&amp;#039;&amp;#039;&amp;#039;-ul se expandează în text:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#define PI 3.1415;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    float f = PI * 2; // Replaced to: float f = 3.1415; * 2; &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Se vede imediat că sintaxa este greșită și compilatorul va genera o eroare.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pentru a anula definiția unui &amp;#039;&amp;#039;&amp;#039;macro&amp;#039;&amp;#039;&amp;#039;, se folosește directiva &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#undef&amp;lt;/code&amp;gt; astfel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#undef PI&lt;br /&gt;
#undef DEBUG&lt;br /&gt;
#undef MAX&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemplu ===&lt;br /&gt;
&lt;br /&gt;
* Modificați fișierul &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;test_preprocessor.c&amp;lt;/code&amp;gt; în felul următor:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#define PI 3.1415&lt;br /&gt;
#define INC(x) (x + 1)&lt;br /&gt;
#define DEBUG&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    printf(&amp;quot;PI is %f\n&amp;quot;, PI);&lt;br /&gt;
    printf(&amp;quot;%d comes after 4\n&amp;quot;, INC(4));&lt;br /&gt;
&lt;br /&gt;
#ifdef DEBUG&lt;br /&gt;
    printf(&amp;quot;This runs in debug mode\n&amp;quot;);&lt;br /&gt;
#else&lt;br /&gt;
    printf(&amp;quot;This runs in release mode\n&amp;quot;);&lt;br /&gt;
#endif&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Rulați comanda &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;make&amp;lt;/code&amp;gt; în consolă.&lt;br /&gt;
* Afișați cele două fișiere .c. Observați diferențele.&lt;br /&gt;
&lt;br /&gt;
== Directivele &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#ifndef&amp;lt;/code&amp;gt; și &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#define&amp;lt;/code&amp;gt; pe post de gardă pentru dublă incluziune ==&lt;br /&gt;
&lt;br /&gt;
Luând ca punct de plecare [[#Exemplu|primul exemplu]] de la directiva &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#include&amp;lt;/code&amp;gt;, oare ce se întâmplă dacă header-ul &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;header_file.h&amp;lt;/code&amp;gt; este inclus de două ori?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;quot;header_file.h&amp;quot;&lt;br /&gt;
#include &amp;quot;header_file.h&amp;quot;&lt;br /&gt;
int main(){&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Răspunsul este simplu, preprocesorul va înlocui ambele linii cu conținutul fișierului, lucru care va face ca variabila &amp;#039;&amp;#039;&amp;#039;variable&amp;#039;&amp;#039;&amp;#039; să fie definită de două ori, lucru care sintactic greșit în C. Sigur, nimeni nu va include în mod voit un header de două ori, dar este posibil ca indirect lucrul acesta să se întâmple. Spre exemplu, dacă în fișierul &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;header_file.h&amp;lt;/code&amp;gt; este inclus  &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;stdio.h&amp;lt;/code&amp;gt;, iar în &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;test_preprocessor.c&amp;lt;/code&amp;gt; sunt incluse și &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;header_file.h&amp;lt;/code&amp;gt; și &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;stdio.h&amp;lt;/code&amp;gt;. În această situație, &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;stdio.h&amp;lt;/code&amp;gt; ajunge să fie inclus de două ori. Pentru a evita problemele apărute în această situație, se folosește garda de incluziune ([https://en.wikipedia.org/wiki/Include_guard include guard]). Aceasta se adaugă în fiecare fișier header:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot; line&amp;gt;&lt;br /&gt;
#ifndef _HEADER_FILE_H_&lt;br /&gt;
#define _HEADER_FILE_H_&lt;br /&gt;
&lt;br /&gt;
// This is the start of the header file&lt;br /&gt;
int variable;&lt;br /&gt;
// This is the end of the header file&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Includerea acestui fișier de către preprocesor se realizează acum în următoarea secvență:&lt;br /&gt;
# Prima directivă include din fișerul sursă C va copia conținutul fișierului de mai sus în locul unde este inclus (test_preprocesor.c, linia 1).&lt;br /&gt;
# Directiva ifndef verifică dacă &amp;#039;&amp;#039;&amp;#039;macro&amp;#039;&amp;#039;&amp;#039;-ul _HEADER_FILE_H_ &amp;#039;&amp;#039;nu&amp;#039;&amp;#039; este definit (header_file.h, linia 1).&lt;br /&gt;
# Deoarece nu este definit, tot textul dintre ifndef și endif se păstrează (header_file.h, liniile 2-7).&lt;br /&gt;
# Prima linie din text-ul păstrat este o directivă define care definește  &amp;#039;&amp;#039;&amp;#039;macro&amp;#039;&amp;#039;&amp;#039;-ul_HEADER_FILE_H (header_file.h, linia 2).&lt;br /&gt;
# A doua directivă include din fișerul sursă C va copia conținutul fișierului de mai sus în locul unde este inclus (test_preprocesor.c, linia 2).&lt;br /&gt;
# Directiva ifndef verifică dacă &amp;#039;&amp;#039;&amp;#039;macro&amp;#039;&amp;#039;&amp;#039;-ul _HEADER_FILE_H_ &amp;#039;&amp;#039;nu&amp;#039;&amp;#039; este definit (header_file.h, linia 1).&lt;br /&gt;
# Deoarece el acum ESTE definit în cadrul include-ului anterior, tot textul dintre ifndef și endif se elimină (header_file.h, liniile 2-7).&lt;br /&gt;
&lt;br /&gt;
=== Alternativă la &amp;#039;&amp;#039;&amp;#039;include guards&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;#pragma once&amp;#039;&amp;#039; ===&lt;br /&gt;
&lt;br /&gt;
Problema cu &amp;#039;&amp;#039;&amp;#039;include guards&amp;#039;&amp;#039;&amp;#039; este că pe lângă faptul ca este o construcție complicată care are nevoie de linii adăugate în fișierul header și la început și la sfârșit, numele macro-ului definit se poate repeta accidental în două sau mai multe fișiere, în această situație neincluzându-se decât primul din aceste fișiere.&lt;br /&gt;
&lt;br /&gt;
O alternativă non-standard dar suportată de majoritatea compilatoarelor (inclusiv C++) este utilizarea directivei &amp;lt;code style=&amp;quot;color: #00AA00&amp;quot;&amp;gt;#pragma once&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot; line&amp;gt;&lt;br /&gt;
#pragma once&lt;br /&gt;
&lt;br /&gt;
// This is the start of the header file&lt;br /&gt;
int variable;&lt;br /&gt;
// This is the end of the header file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemplu ===&lt;br /&gt;
&lt;br /&gt;
* Modificați fișierul &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;test_preprocessor.c&amp;lt;/code&amp;gt; pentru a include header-ul &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;header_file.h&amp;lt;/code&amp;gt; de două ori, conform exemplului de mai sus.&lt;br /&gt;
* Rulați comanda &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;make&amp;lt;/code&amp;gt; și confirmați dubla declarare a variabilei &amp;#039;&amp;#039;&amp;#039;variable&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* Adăugați gardă de incluziune fișierului header, conform exemplului de mai sus.&lt;br /&gt;
* Rulați comanda &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;make&amp;lt;/code&amp;gt; și confirmați că variabila &amp;#039;&amp;#039;&amp;#039;variable&amp;#039;&amp;#039;&amp;#039; este declarată o singură dată.&lt;br /&gt;
* Înlocuiți garda de incluziune cu &amp;lt;code style=&amp;quot;color: #00AA00&amp;quot;&amp;gt;#pragma once&amp;lt;/code&amp;gt;&lt;br /&gt;
* Rulați comanda &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;make&amp;lt;/code&amp;gt; și confirmați că variabila &amp;#039;&amp;#039;&amp;#039;variable&amp;#039;&amp;#039;&amp;#039; este declarată o singură dată.&lt;/div&gt;</summary>
		<author><name>Rhobincu</name></author>
	</entry>
</feed>