C/Directrices para o preprocesador: Diferenzas entre revisións

Contido eliminado Contido engadido
Gallaecio (conversa | contribucións)
mSen resumo de edición
Gallaecio (conversa | contribucións)
Revisión completa. Agora toda completar.
Liña 1:
{{Navegador|Función principalFuncións|Estrutura e estilo}}
 
{| align="right" style="margin-left: 1em;"
O ''preprocesador'' de C identifica todas as liñas de código que comecen polo carácter <code>#</code> coma ordes para el. As principais ordes para o ''preprocesador'' son [[{{PAGENAME}}#include|<code>#include</code>]] e [[{{PAGENAME}}#define|<code>#define</code>]].
| __TOC__
|} <!-- Isto sitúa o índice á dereita -->
 
O ''preprocesador'' de C identifica todas as liñas de código que comecen polo carácter <code>#</code> coma ordes para el. As principais ordes para o ''preprocesador'' son [[{{PAGENAME}}#include.23include|<codesource lang=c enclose=none>#include</codesource>]] e [[{{PAGENAME}}#define.23define|<codesource lang=c enclose=none>#define</codesource>]].
==<code>define</code>==
Esta orde define o valor que terá un texto no código. Isto é: lle di ao ''precompilador'' que cada vez que se atope no código cun "''macro''" que nós establezamos, o substitúa por un valor que nós establezamos. Isto permítenos repetir un valor varias veces ao longo do código, e o máis importante, facilita a tarefa de cambiar dito valor en todo o código, reducíndoa a cambiar o valor no <code>#define</code>.
 
==<source lang=c enclose=none>#define</source>==
Tamén pode mellorar a comprensión do código, mediante o uso de ''macros'' descritivos, coma a primeira orde do seguinte exemplo:
:''Prefírese o uso de variables [[{{BASEPAGENAME}}/Modificadores#const|constantes]] no seu lugar sempre que sexa posible.''
Esta orde permite realizar substitucións sistemáticas de texto ao longo dun código fonte. A súa sintaxe fundamental é a seguinte:
<source lang=c>
#define TEXTO SUBSTITUCIÓN
// Podemos especificar o tipo de dato que terá en todo o código o valor numérico:
</source>
#define IVE 16L
// Asemade, podemos asignar unha cadea en lugar dun valor:
#define AVANZA "Preme a frecha esquerda"
 
Onde:
int main(void){
*<code>TEXTO</code> é o texto a buscar e
...
*<code>SUBSTITUCIÓN</code> é o texto que o vai substituír.
c = a+a*(IVE/100); // Substitúese IVE por 16 (tipo long)
...
printf(AVANZA); // Substitúese AVANZA por "Preme a frecha esquerda"
 
Esta orde para o ''preprocesador'' permite, por exemplo, repetir un mesmo valor numérico como [[{{BASEPAGENAME}}/Constantes literais|constante]] varias veces ao longo dun mesmo código, e o máis importante, facilita a tarefa de cambiar dito valor en todo o código, reducíndoa a cambiar o valor no <source lang=c enclose=none>#define</source>. E en caso de utilizar palabras clave descritivas, permite asemade mellorar a comprensión do código fonte.
}
<source lang=c>
#define IVE 16L
// [...]
c = a+a*(IVE/100); // Substitúese IVE por 16 (tipo long)16L.
// (o «L» é para especificar o tipo de dato, “long”, do «16»)
// [...]
</source>
 
As palabras clave a utilizar cos <source lang=c enclose=none>#define</source> adoitan escribirse dun xeito que se evite calquera posible coincidencia accidental. Para iso adoitan escribirse completamente en maiúsculas, e comezar cunha barra baixa, «<code>_</code>».
Xeralmente, os ''macros'' escríbense en maiúsculas, para que outros programadores os recoñezan como tales. De todos xeitos, sempre que sexa posible, convén usar o [[{{PAGENAME}}#const|seguinte método]], que se ben está máis limitado nalgúns aspectos ten menor problemática en xeral.
 
==<codesource lang=c enclose=none>#ifdef</codesource>==
Esta orde permite establecer o que se coñece como un “grupo condicional”. Permite establecer que unha serie de instrucións só se empreguen finalmente no código fonte en caso de que unha palabra clave fose previamente definida. A súa sintaxe fundamental é a seguinte:
A sintaxe fundamental desta orde é a seguinte:
<source lang=c>
#ifdef MACROCLAVE
// Instrucións.
ordes
#endif /* MACRO */
</source>
 
Os grupos condicionais poden aniñarse, pero de facerse ten que ser completamente. É dicir, o peche dun grupo condicional (<codesource lang=c enclose=none>#endif</codesource>) pecha o inicio de grupo condicional inmediatamente anterior (<codesource lang=c enclose=none>#ifdef</codesource>). Tampouco se pode distribuír un grupo condicional en ficheiros separados.
Isto é o que se adoita chamar un "grupo condicional". O grupo de <code>ordes</code> definidas só se lle fornecerán ao ''preprocesador'' en caso de que se defina <code>MACRO</code>.
 
Aínda que non se definadefinise previamente a condición (<code>MACROCLAVE</code> (e por tanto as instrucións non van estar presenten no código final), o ''preprocesador'' analizará sintacticamente as ordes do grupo condicional, polo que estas terán que serseguir ena todosintaxe momentoda códigolinguaxe C correctode todos xeitos.
Os grupos condicionais poden aniñarse, pero de facerse ten que ser completamente. É dicir, o peche dun grupo condicional (<code>#endif</code>) pecha o inicio de grupo condicional inmediatamente anterior (<code>#ifdef</code>). Tampouco se pode distribuír un grupo condicional en ficheiros separados.
 
Considérase unha boa práctica indicar cun [[{{BASEPAGENAME}}/Comentarios|comentario]] ao carón do <source lang=c enclose=none>#endif</source> cal é a clave que remata aí. Isto mellora a comprensión do código.
Aínda que non se defina a condición (<code>MACRO</code>), o ''preprocesador'' analizará sintacticamente as ordes do grupo condicional, polo que estas terán que ser en todo momento código C correcto.
 
==<source lang=c enclose=none>#ifndef</source>==
O comentario a continuación do <code>#endif</code> non é necesario, pero escribilo é un bo costume. A súa presencia será de gran axuda para a lectura rápida do código en caso de haber moitas ordes dentro do grupo condicional. En todo caso, cómpre lembrar que debe ir coma un comentario, así que non hai que esquecer os caracteres precisos para tal, <code>/*</code> e <code>*/</code> ou <code>//</code>.
Esta orde é idéntica a [[#.23ifdef|<source lang=c enclose=none>#ifdef</source>]], pero o seu contido emprégase cando a <code>CLAVE</code> '''non''' se definiu previamente.
 
Cómpre botarlle unha ollada á lista de [[{{BASEPAGENAME}}/Macros estándar|''macros'' estándar]].
 
==<code>ifndef</code>==
Ás veces, ao contrario que na directriz anterior, cómpre que se utilicen certas ordes para o ''precompilador'' cando o <code>MACRO</code> non estea definido. A sintaxe é por tanto moi similar á do <code>#ifdef</code>:
<source lang=c>
#ifndef MACRO
ordes
#endif /* MACRO */
</source>
 
Un uso habitual deste tipo de directriz para o ''preprocesador'' consiste no uso de certas ordes unicamente a primeira vez que se [[{{PAGENAME}}#include|inclúe]] un ficheiro de cabeceira.
 
==<code>include</code>==
Esta orde para o ''precompilador'' utilízase para dúas cousas: ben para indicarlle ao ''precompilador'' o nome do ficheiro de cabeceira que contén os [[{{BASEPAGENAME}}/Funcións#Declaración dunha función|prototipos]] das funcións utilizadas no programa que forman parte da colección de bibliotecas do compilador, ou ben cargar un ficheiro de código externo que conteña a [[{{BASEPAGENAME}}/Funcións#Definición dunha función|definición]] dunha ou máis funcións ás que se [[{{BASEPAGENAME}}/Funcións#Chamada a unha función|chama]] no programa.
 
==<source lang=c enclose=none>#include</source>==
Esta orde para o ''precompilador'' utilízase para incluír no código fonte os [[{{BASEPAGENAME}}/Funcións#Ficheiro de cabeceira|ficheiros de cabeceira]] de [[{{BASEPAGENAME}}/Funcións#Bibliotecas de funcións|bibliotecas de funcións]]. A súa sintaxe dependerá de se o ficheiro de cabeceira en cuestión está no directorio de busca do compilador ─en cuxo caso só será necesario o nome do ficheiro─, ou noutro directorio ─en cuxo caso será necesaria a súa ruta absoluta ou relativa ao ficheiro co código fonte─. As súas sintaxes fundamentais son as seguintes:
<source lang=c>
// Biblioteca no directorio do compilador:
#include <ficheiro.h>
// Biblioteca noutro directorio:
</source>
Esta orde inclúe o ficheiro de cabeceira <code>ficheiro.h</code>, e o ''precompilador'' buscará dito ficheiro no directorio por defecto de ficheiros de cabeceira do compilador.
 
<source lang=c>
#include "/ruta/ao/ficheiro.h"
</source>
Esta outra orde inclúe no código o contido dun ficheiro externo que se supón contén as definicións dunha serie de funcións que se utilizarán no código.
 
==<codesource lang=c enclose=none>#pragma</codesource>==
===Incluír bibliotecas de Windows===
Mediante a seguinte liña, substituíndo <code>biblioteca</code> polo nome da biblioteca en cuestión, podemospódese especificar en [[Windows]] unha biblioteca da que depende o código fonte. O nome da biblioteca, tal e como se amosa a continuación, debe ir delimitado por comiñas dobres (<code>"</code>).
<source lang=c>
#pragma comment(lib, "biblioteca")
Liña 72 ⟶ 63:
 
==Véxase tamén==
Cómpre botarlle unha ollada á lista de *[[{{BASEPAGENAME}}/MacrosClaves estándar|''macros''Claves estándar]].
===Ligazóns externas===
*[http://gcc.gnu.org/onlinedocs/cpp/Ifdef.html <code>#ifdef</code> no manual do ''precompilador'' de GCC] (en inglés).
*[http://techbrahmana.blogspot.com/2008/04/pragma-commentlib-cool-way-to-indicate.html <code>#pragma comment(lib, "biblioteca")</code> para indicar dependencias] (en inglés).
 
 
{{Navegador|Función principalFuncións|Estrutura e estilo}}
 
<!-- Categorías: -->