Zahrnout směrnici - Include directive

Mnoho programovacích jazyků a dalších počítačových souborů má direktivu , často nazývanou include(někdy copynebo import), která způsobí vložení obsahu druhého souboru do původního souboru. Tyto zahrnuté soubory se nazývají písanky nebo hlavičkový soubor s. Často se používají k definování fyzického rozložení programových dat, částí procedurálního kódu a/nebopředávání prohlášenípři podpořezapouzdřenía opětovného použití kódu.

Účel

Tato includesměrnice umožňuje vývoj knihoven kódu, které pomáhají:

  • zajistit, aby každý v programu používal stejnou verzi definice rozložení dat nebo procedurálního kódu,
  • snadný křížový odkaz tam, kde jsou komponenty použity v systému,
  • v případě potřeby snadno měnit programy (je třeba upravovat pouze jeden hlavní soubor, oproti úpravám každé instance se používá stejný datový typ nebo se volá funkce ) a
  • ušetříte čas tím, že nebudete muset kódovat rozsáhlá rozložení dat (malá, ale užitečná).

Příklad situace, která těží z použití direktivy include, je při odkazování na funkce v jiném souboru. Předpokládejme, že máme funkci addv jednom souboru, který je pak deklarován (s prototypem funkce ) a poté odkazován ve druhém zdrojovém souboru následujícím způsobem:

int add(int, int);

int triple(int x)
{
    return add(x, add(x, x));
}

Jednou nevýhodou této metody je, že prototyp musí být přítomen ve všech souborech, které tuto funkci používají. Další nevýhodou je, že pokud se změní návratový typ nebo argumenty funkce, bude nutné tyto prototypy aktualizovat. Uvedením prototypu do jednoho samostatného souboru se těmto problémům vyhnete. Za předpokladu, že je prototyp přesunut do souboru add.h, se druhý zdrojový soubor může stát:

#include "add.h"

int triple(int x)
{
    return add(x, add(x,x));
}

Nyní, pokaždé, když je kód kompilován, add.hbudou do souborů, které je používají, zahrnuty nejnovější prototypy funkcí , čímž se zabrání potenciálně katastrofálním chybám.

Jazyková podpora

C/C ++

V C a C ++ se #include směrnice preprocessor způsobí, že kompilátor nahradit tento řádek s celým textem obsahu s názvem zdrojového souboru (pokud jsou zahrnuty v uvozovkách: „“) nebo s názvem záhlaví (je-li obsažen v hranatých závorkách: <>); Všimněte si, že záhlaví nemusí být zdrojový soubor. Inkluze pokračuje rekurzivně na tomto zahrnutém obsahu, až do limitu vnoření definovaného implementací. Záhlaví nemusí mít názvy odpovídající souborům: v jazyce C ++ jsou standardní záhlaví obvykle označována slovy, například „vektor“, takže #include <vector>zatímco v jazyce C mají standardní záhlaví identifikátory ve formě názvů souborů s příponou „.h“, jako v #include <stdio.h>. „Zdrojový soubor“ může být jakýkoli soubor s názvem v jakékoli formě, ale nejčastěji se jmenuje s příponou „.h“ a nazývá se „soubor záhlaví“ (někdy „.hpp“ nebo „.hh“ pro rozlišení C ++) hlavičky), přestože mohou být zahrnuty také soubory s příponami .c, .cc a .cpp (zejména v technice jednotné kompilační jednotky ) a někdy se používají i další přípony.

Tyto dvě formy #includesměrnice mohou určit, který záhlaví nebo zdrojový soubor zahrnout způsobem definovaným implementací. V praxi se obvykle dělá to, že lomené závorky vyhledávají zdrojové soubory ve standardním systémovém adresáři (nebo sadě adresářů) a poté vyhledávají zdrojové soubory v místních nebo projektově specifických cestách (uvedených na příkazovém řádku, v proměnné prostředí nebo v souboru Makefile nebo v jiném sestavovacím souboru), zatímco formulář s uvozovkami nehledá ve standardním systémovém adresáři, ale pouze v místních nebo projektově specifických cestách. V případě, že nedojde ke střetu, lze k určení zahrnutí specifických pro projekt použít také formulář úhlových závorek, ale toto je považováno za špatný tvar. Skutečnost, že záhlaví nemusí odpovídat souborům, je především technická implementace a používá se k vynechání přípony .h při zahrnutí standardních záhlaví C ++; v běžném používání „záhlaví“ znamená „soubor záhlaví“.

Například:

#include <stdio.h>  // Include the contents of the standard header 'stdio.h' (probably a file 'stdio.h').
#include <vector>  // Include the contents of the standard header 'vector' (probably a file 'vector.h').
#include "user_defined.h"  // Include the contents of the file 'user_defined.h'.

V jazycích C a C ++ mohou nastat problémy, pokud dva (nebo více) zahrnují soubory a oba postupně obsahují stejný třetí soubor. Jedním z řešení je vyhnout se zahrnutí souborů z zahrnutí jakýchkoli jiných souborů, případně vyžadovat, aby programátor ručně přidal do původního souboru další direktivy zahrnout. Dalším řešením je použít ochranné kryty .

COBOL

COBOL (a také RPG IV ) umožňuje programátorům kopírovat sešity do zdroje programu podobným způsobem jako hlavičkové soubory, ale také umožňuje nahradit v nich určitý text jiným textem. Klíčové slovo COBOL pro zahrnutí je COPYa nahrazení se provádí pomocí REPLACING ... BY ...klauzule. V COBOL je od COBOL 60 přítomen direktiva include, ale změněna z původního INCLUDEna COPY1968.

Fortran

Fortran nevyžaduje soubory záhlaví jako takové . Fortran 90 a novější však mají dvě související funkce: includepříkazy a moduly. První z nich lze použít ke sdílení společného souboru obsahujícího rozhraní procedur, podobně jako záhlaví C, i když specifikace rozhraní není vyžadována u všech druhů procedur Fortran. Tento přístup se běžně nepoužívá; místo toho jsou procedury obecně seskupeny do modulů, na které pak lze odkazovat usepříkazem v jiných oblastech kódu. U modulů kompilátor automaticky generuje informace o rozhraní typu záhlaví a obvykle je vkládá do samostatných souborů modulů, ačkoli někteří překladači umístili tyto informace přímo do souborů objektů. Samotná jazyková specifikace nevyžaduje vytvoření dalších souborů, přestože rozhraní procedur modulu jsou tímto způsobem šířena téměř univerzálně.

Pascal

Většina kompilátorů Pascal podporuje direktivu $inebo $includekompilátor, ve které direktiva $inebo $includebezprostředně navazuje na začátek bloku komentářů ve formě

  • {$i filename.pas}
  • (*$I filename.inc*)
  • {$include filename.inc}
  • (*INCLUDE filename.pas*)

Kde direktiva $ior nerozlišuje velká a malá písmena a název_souboru.pas nebo název_souboru.inc je název souboru, který má být zahrnut. (Běžnou praxí je pojmenovávat soubory pascal include s příponou .inc, ale není to nutné.) Některé kompilátory, aby se zabránilo rekurzi Crock , omezily vyvolání zahrnovaného souboru na určité číslo, zakázaly vyvolávat samotný soubor nebo jakýkoli aktuálně otevřený soubor, nebo je omezen na maximálně jeden zahrnout soubor najednou, např. zahrnout soubor nemůže obsahovat sebe nebo jiný soubor, nicméně program, který obsahuje jiné soubory, může obsahovat několik, pouze jeden najednou. $include

PHP

V PHP je includedirektiva způsobí jiný soubor PHP, které mají být zahrnuty a vyhodnocovány. Podobné příkazy require, které při výpadku zahrnout bude produkovat fatální výjimku a zastavení skriptu, a include_oncea require_once, což způsobí, že soubor neměl být zařazen nebo dále třeba, pokud již byly nebo požaduje, aby se zabránilo problém dvojí začlenění složky C je.

Jiné jazyky

Existuje mnoho forem direktivy include, jako například:

Moderní jazyky (např. Haskell a Java ) se spíše vyhýbají sešitům nebo zahrnutím, upřednostňují moduly a systémy importu/exportu pro řízení oboru názvů . Některé z těchto jazyků (například Java a C# ) nepoužívají dopředné deklarace a místo toho jsou identifikátory rozpoznávány automaticky ze zdrojových souborů a čteny přímo ze symbolů dynamické knihovny (obvykle se odkazují na importnebo z usingdirektiv), což znamená, že soubory záhlaví nejsou potřeba.

Viz také

Reference

externí odkazy