2012-12-03 14 views
5

Powiel możliwe:
What is the difference between #include <filename> and #include “filename”?Dlaczego działa #include "stdio.h"?

Dlaczego nie kompilator narzekać kiedy piszę co następuje:

#include "stdio.h" 

Jeżeli nie byłoby

#include <stdio.h> 

zamiast tego, ponieważ stdio.h jest rzeczywiście przechowywany w folderze biblioteki, a nie w folderze jednostki tłumaczeniowej? Dlaczego tak działa?

+1

'" ... "' wygląda lokalnie * pierwszy *, a następnie gdzie indziej. – BoBTFish

+1

Nie, powinno to być '#inlcude ' – 111111

+1

http://stackoverflow.com/questions/21593/what-jest-odstawieniem-między-wprowadzeniem-nazwa_plików- i -włączą-nazwępliku – BoBTFish

Odpowiedz

8

Różnica między "" a <> nie jest duża. Oba wyszukiwania nagłówka w miejscach zdefiniowanych przez implementację 1, 2. Różnica polega na tym, że jeśli wyszukiwanie nie powiedzie się dla "", wyszukiwanie odbywa się tak, jakby było używane <>. (§16.2)

Zasadniczo oznacza to, że jeśli <> znajdzie nagłówek z określoną nazwą, "" nie uda się znaleźć nagłówek o tej samej nazwie .


Te miejsca wdrożeniowe zdefiniowane nie muszą być takie same dla obu form.

Nie ma wymogu, aby jeden z tych folderów biblioteki wyszukiwania, a drugi wyszukiwał folder w JT. Kompilator może przeszukiwać cały system plików, a nawet google, jeśli chce.

Nie oznacza to, że zawsze znajdują ten sam nagłówek.

+0

Istnieje jednak wymóg, że jeśli '#include" xxx "' zawiedzie, kompilator ponownie przetworzy go tak, jakby był '#include '. –

+0

@ James To zamierzałem powiedzieć trzecie zdanie. Czy myślisz, że powinienem to przeformułować, czy też tęskniłeś za tym? –

+0

+1 dla plików źródłowych Google :-) – Angew

0

Dzieje się tak ze względu na sposób definiowania składni include.

#include <cstdio> oznacza, że ​​kompilator powinien zawierać biblioteki standardowej cstdio

#include "cstdio" oznacza, że ​​kompilator powinien spróbować znaleźć plik „cstdio”, szuka przede wszystkim w bieżącym katalogu i przy użyciu lokalizację standardowych bibliotek jako awaryjnej .

+2

Niezależnie od tego, czy '#include <>' lub '#include" "' wygląda w katalogu bieżącym jako pierwsze lub w ogóle jest zdefiniowane w całości. –

0

"" kontra <> zmienia jedynie kolejność wyszukiwania.

więc z

#include "stdio.h" 

Prekompilator rozpocznie wyszukiwanie w katalogu jednostki tłumaczeniowej, a następnie przenieść się do predefiniowanego „obejmują” katalogi

Zważywszy

#include <stdio.h> 

Czy odwrót

+0

@CharlesBailey Ale w praktyce przyjmuje się, że "..." powinno najpierw znaleźć się w katalogu, który zawiera plik z załącznikiem. (Z drugiej strony, nie myślę, że jakikolwiek kompilator będzie wyglądał w bieżącym katalogu dla pliku włączającego, chyba że podasz go '-I." Lub plik, który czyta jest w bieżącym katalogu.) –

+0

@CharlesBailey, gdzie czy powiedziałem coś o katalogu ** current **? –

+0

@aleguna: Przepraszamy, dla "bieżącego katalogu" należy przeczytać "katalog zawierający początkowy plik źródłowy dla kompilowanej jednostki tłumaczeniowej". Byłem leniwy. –

Powiązane problemy