คอมไพเลอร์ของคุณเพิ่งพยายามรวบรวมไฟล์ชื่อfoo.cc
. เมื่อกดปุ่มหมายเลขบรรทัดline
คอมไพเลอร์จะพบ:
#include "bar"
หรือ
#include <bar>
จากนั้นคอมไพเลอร์จะพยายามค้นหาไฟล์นั้น สำหรับเรื่องนี้มันจะใช้ชุดของไดเรกทอรีที่จะเข้าไปดู bar
แต่ภายในชุดนี้ไม่มีแฟ้ม สำหรับคำอธิบายของความแตกต่างระหว่างรุ่นของ ๆ รวมถึงการดูคำสั่งที่นี่
จะบอกคอมไพเลอร์ได้อย่างไรว่าจะหาได้ที่ไหน
g++
-I
มีตัวเลือก ช่วยให้คุณเพิ่มรวมเส้นทางการค้นหาลงในบรรทัดคำสั่ง ลองนึกภาพว่าไฟล์ของคุณbar
อยู่ในโฟลเดอร์ที่มีชื่อfrobnicate
สัมพันธ์กับfoo.cc
(สมมติว่าคุณกำลังรวบรวมจากไดเร็กทอรีที่foo.cc
อยู่):
g++ -Ifrobnicate foo.cc
คุณสามารถเพิ่มเส้นทางรวมเพิ่มเติมได้ แต่ละรายการที่คุณให้นั้นสัมพันธ์กับไดเร็กทอรีปัจจุบัน คอมไพเลอร์ของ Microsoft มีตัวเลือกที่สัมพันธ์กัน/I
ซึ่งทำงานในลักษณะเดียวกันหรือใน Visual Studio สามารถตั้งค่าโฟลเดอร์ในหน้าคุณสมบัติของโครงการภายใต้คุณสมบัติการกำหนดค่า -> C / C ++ -> ทั่วไป -> ไดเรกทอรีรวมเพิ่มเติม
ตอนนี้ลองนึกภาพคุณมีหลายเวอร์ชันbar
ในโฟลเดอร์ต่างๆโดยให้:
#include<string>
std::string which() { return "A/bar"; }
#include<string>
std::string which() { return "B/bar"; }
#include<string>
std::string which() { return "C/bar"; }
#include "bar"
#include <iostream>
int main () {
std::cout << which() << std::endl;
}
ลำดับความสำคัญด้วย#include "bar"
ซ้ายสุด:
$ g++ -IA -IB -IC foo.cc
$ ./a.out
A/bar
ในขณะที่คุณเห็นเมื่อคอมไพเลอร์เริ่มมองผ่านA/
, B/
และC/
ก็หยุดที่ตีครั้งแรกหรือซ้ายสุด
นี่คือความจริงของทั้งสองรูปแบบและinclude <>
incude ""
ความแตกต่างระหว่าง#include <bar>
และ#include "bar"
โดยปกติแล้วสิ่งที่#include <xxx>
ทำให้ดูเป็นโฟลเดอร์ระบบก่อน#include "xxx"
ทำให้ดูเป็นโฟลเดอร์ปัจจุบันหรือโฟลเดอร์ที่กำหนดเองก่อน
เช่น:
สมมติว่าคุณมีไฟล์ต่อไปนี้ในโฟลเดอร์โครงการของคุณ:
list
main.cc
กับmain.cc
:
#include "list"
....
สำหรับสิ่งนี้คอมไพลเลอร์ของคุณจะ#include
เก็บไฟล์list
ไว้ในโฟลเดอร์โปรเจ็กต์ของคุณเนื่องจากคอมไพเลอร์ในปัจจุบันmain.cc
และมีไฟล์นั้นlist
อยู่ในโฟลเดอร์ปัจจุบัน
แต่ด้วยmain.cc
:
#include <list>
....
จากนั้นg++ main.cc
คอมไพเลอร์ของคุณจะมองเข้าไปในโฟลเดอร์ระบบก่อนและเนื่องจาก<list>
เป็นส่วนหัวมาตรฐาน#include
ไฟล์list
ที่มาพร้อมกับแพลตฟอร์ม C ++ ของคุณจะเป็นส่วนหนึ่งของไลบรารีมาตรฐาน
ทั้งหมดนี้ง่ายขึ้นเล็กน้อย แต่ควรให้แนวคิดพื้นฐานแก่คุณ
รายละเอียดเกี่ยวกับ<>
/ - ""
ลำดับความสำคัญและ-I
ตามเอกสาร gccลำดับความสำคัญสำหรับinclude <>
"ระบบ Unix ปกติ" ดังต่อไปนี้:
/usr/local/include
libdir/gcc/target/version/include
/usr/target/include
/usr/include
สำหรับโปรแกรม C ++ จะมีลักษณะใน / usr / include / c ++ / version ก่อนเช่นกัน ในข้างต้นเป้าหมายคือชื่อมาตรฐานของระบบ GCC ถูกกำหนดค่าให้คอมไพล์โค้ดสำหรับ; [... ].
เอกสารยังระบุ:
คุณสามารถเพิ่มในรายการนี้ด้วยตัวเลือกบรรทัดคำสั่ง -Idir ไดเรกทอรีทั้งหมดตั้งชื่อโดย -I จะค้นหาในซ้ายไปขวาสั่งซื้อก่อนที่จะเริ่มต้นไดเรกทอรี ข้อยกเว้นเพียงอย่างเดียวคือเมื่อ dir ถูกค้นหาตามค่าเริ่มต้นแล้ว ในกรณีนี้อ็อพชันจะถูกละเว้นและลำดับการค้นหาไดเร็กทอรีระบบจะไม่เปลี่ยนแปลง
เพื่อดำเนินการต่อ#include<list> / #include"list"
ตัวอย่างของเรา(รหัสเดียวกัน):
g++ -I. main.cc
และ
#include<list>
int main () { std::list<int> l; }
และแน่นอนว่าการ-I.
จัดลำดับความสำคัญของโฟลเดอร์.
เหนือระบบรวมถึงและเราได้รับข้อผิดพลาดของคอมไพเลอร์