c++ - ما الفرق بين#include<filename> و#include "filename"؟




header-files c-preprocessor (20)

the " < filename > " searches in standard C library locations

whereas "filename" searches in the current directory as well.

Ideally, you would use <...> for standard C libraries and "..." for libraries that you write and are present in the current directory.

في لغات برمجة C و C ++ ، ما هو الفرق بين استخدام أقواس زاوية واستخدام علامات اقتباس في عبارة include ، كما يلي؟

  1. #include <filename>
  2. #include "filename"

#include <filename>

عند الرغبة في استخدام ملف الرأس الخاص بنظام C / C ++ أو مكتبات المترجم. يمكن أن تكون هذه المكتبات stdio.h ، string.h ، math.h ، إلخ.

#include "path-to-file/filename"

عند الرغبة في استخدام ملف الرأس المخصص الخاص بك الموجود في مجلد المشروع أو في مكان آخر.

لمزيد من المعلومات حول preprocessors والرأس. قراءة C - Preprocessors .


الطريقة الوحيدة لمعرفة ذلك هي قراءة وثائق التنفيذ الخاصة بك.

في المعيار C ، الفقرة 6.10.2 ، تنص الفقرات 2 إلى 4 على:

  • توجيه مسبق المعالجة للنموذج

    #include <h-char-sequence> new-line
    

    يبحث عن تسلسل للأماكن المحددة للتنفيذ لرأس محدد بشكل فريد بالتسلسل المحدد بين < و > المحددات ، ويؤدي إلى استبدال هذا التوجيه بمحتويات الرأس بأكملها. كيفية تحديد الأماكن أو تحديد الرأس المحدد بالتنفيذ.

  • توجيه مسبق المعالجة للنموذج

    #include "q-char-sequence" new-line
    

    يتسبب استبدال هذا التوجيه من خلال محتويات الملف المصدر المحددة بواسطة التسلسل المحدد بين " المحددات. يتم البحث عن الملف المصدر المحدد بطريقة محددة بالتنفيذ. إذا لم يكن هذا البحث مدعومًا ، أو إذا فشل البحث ، إعادة معالجة التوجيه كما لو كان يقرأ

    #include <h-char-sequence> new-line
    

    مع التسلسل المتضمن المتضمن (بما في ذلك > الأحرف ، إن وجدت) من التوجيه الأصلي.

  • توجيه مسبق المعالجة للنموذج

    #include pp-tokens new-line
    

    (لا يتطابق أحد النموذجين السابقين) مسموح به. تتم معالجة الرموز المميزة السابقة للتنفيذ بعد include في التوجيه كما هو الحال في النص العادي. (يتم استبدال كل معرف يتم تعريفه حاليًا كاسم ماكرو بقائمة الاستبدال الخاصة برموز المعالجة المسبقة.) التوجيه الناتج بعد أن تكون جميع عمليات الاستبدال مطابقة لأحد النموذجين السابقين. الطريقة التي يتم بها تجميع تسلسل رموز التهيئة المسبقة بين زوج الرمز المميز > pre > أو زوج من " الأحرف " في اسم مميز برمجية ذات اسم وحيد.

تعريفات:

  • h-char: أي عضو في مجموعة أحرف المصدر باستثناء حرف السطر الجديد و >

  • q-char: أي عضو في مجموعة أحرف المصدر باستثناء حرف السطر الجديد و "


القاعدة العامة البسيطة هي استخدام الأقواس المائلة لتضمين ملفات الرأس التي تأتي مع المحول البرمجي. استخدم علامات الاقتباس المزدوجة لتضمين أي ملفات رأس أخرى. معظم المترجمين يقومون بذلك بهذه الطريقة.

1.9 - تشرح ملفات الرأس بمزيد من التفاصيل حول توجيهات ما قبل المعالج. إذا كنت مبرمج مبتدئًا ، فيجب أن تساعدك هذه الصفحة في فهم كل ذلك. تعلمت ذلك من هنا ، وأنا أتابعه في العمل.


بالنسبة إلى #include "" ، يبحث المحول البرمجي عادةً عن مجلد الملف الذي يحتوي على المجلد ثم المجلدات الأخرى. بالنسبة إلى #include <> ، لا يبحث المحول البرمجي في مجلد الملف الحالي.


بعض الإجابات الجيدة هنا تشير إلى المعيار C ولكن ننسى معيار POSIX ، خاصةً السلوك المعين لقيادة c99 (على سبيل المثال C compiler) .

وفقًا لإصدار مواصفات Open Group Base 7 ،

من الدليل

قم بتغيير الخوارزمية للبحث عن رؤوس لا تكون أسماءها أسماء مسار مطلقة للبحث في الدليل المسمى بواسطة مسار الدليل قبل البحث في الأماكن المعتادة. وبالتالي ، يجب البحث عن العناوين التي تم تضمين أسماؤها بين علامتي اقتباس مزدوجتين ("") لأول مرة في دليل الملف مع سطر #include ، ثم في الدلائل المسماة في خيارات -I ، والأخيرة في الأماكن المعتادة. بالنسبة للرؤوس التي تكون أسماؤها مُحاطة بأقواس زاوية ("<>") ، يجب البحث عن الرأس فقط في الأدلة المسماة بخيارات -I ثم في الأماكن المعتادة. يجب البحث عن الأدلة المذكورة في الخيارات -I بالترتيب المحدد. يجب أن تدعم التنفيذ عشر حالات على الأقل من هذا الخيار في استدعاء أمر واحد c99 .

لذلك ، في بيئة متوافقة مع POSIX ، مع مترجم C متوافق مع POSIX ، من المحتمل أن يبحث #include "file.h" عن ./file.h أولاً ، حيث . هو الدليل حيث يوجد الملف مع العبارة #include ، بينما #include <file.h> ، من المرجح أن يبحث عن /usr/include/file.h أولاً ، حيث /usr/include هو نظامك المحدد للأماكن المعتادة لـ الرؤوس (يبدو أنه لم يتم تعريفه بواسطة POSIX).


حسب المعيار - نعم ، فهي مختلفة:

  • توجيه مسبق المعالجة للنموذج

    #include <h-char-sequence> new-line
    

    يبحث عن تسلسل للأماكن المحددة للتنفيذ لرأس محدد بشكل فريد بالتسلسل المحدد بين < و > المحددات ، ويؤدي إلى استبدال هذا التوجيه بمحتويات الرأس بأكملها. كيفية تحديد الأماكن أو تحديد الرأس المحدد بالتنفيذ.

  • توجيه مسبق المعالجة للنموذج

    #include "q-char-sequence" new-line
    

    يتسبب في استبدال هذا التوجيه بواسطة محتويات الملف المصدر المحددة بواسطة التسلسل المحدد بين " المحددات. يتم البحث عن الملف المصدر المحدد بطريقة محددة بالتطبيق. إذا لم يكن هذا البحث مدعومًا ، أو إذا فشل البحث ، إعادة معالجة التوجيه كما لو كان يقرأ

    #include <h-char-sequence> new-line
    

    مع التسلسل المتضمن المتضمن (بما في ذلك > الأحرف ، إن وجدت) من التوجيه الأصلي.

  • توجيه مسبق المعالجة للنموذج

    #include pp-tokens new-line
    

    (لا يتطابق أحد النموذجين السابقين) مسموح به. تتم معالجة الرموز المميزة السابقة للتنفيذ بعد include في التوجيه كما هو الحال في النص العادي. (يتم استبدال كل معرف يتم تعريفه حاليًا كاسم ماكرو بقائمة الاستبدال الخاصة برموز المعالجة المسبقة.) التوجيه الناتج بعد أن تكون جميع عمليات الاستبدال مطابقة لأحد النموذجين السابقين. الطريقة التي يتم بها تجميع تسلسل رموز التهيئة المسبقة بين زوج الرمز المميز > pre > أو زوج من " الأحرف " في اسم مميز برمجية ذات اسم وحيد.

تعريفات:

  • h-char: أي عضو في مجموعة أحرف المصدر باستثناء حرف السطر الجديد و >

  • q-char: أي عضو في مجموعة أحرف المصدر باستثناء حرف السطر الجديد و "

لاحظ أن المعيار لا يخبر أي علاقة بين الأخلاقيات المحددة للتنفيذ. يبحث النموذج الأول في طريقة واحدة محددة بالتنفيذ ، والآخر بطريقة (قد تكون أخرى) محددة للتنفيذ. تحدد المواصفة أيضًا أن بعض الملفات المضمنة يجب أن تكون موجودة (على سبيل المثال ، <stdio.h> ).

بشكل رسمي يجب عليك قراءة دليل المترجم الخاص بك ، ولكن عادة (حسب التقليد) يبحث النموذج #include "..." في دليل الملف الذي تم العثور فيه على #include تم #include أولاً ، ثم الدلائل أن #include <...> عمليات البحث عن النموذج (مسار التضمين ، على سبيل المثال ، رؤوس النظام).


سيشمل # تضمين مع أقواس زاوية "قائمة بالأماكن المعتمدة على التنفيذ" (وهي طريقة معقدة جدًا لقول "رؤوس النظام") لتضمين الملف.

سوف تتضمن # تضمين مع علامات اقتباس فقط ابحث عن ملف (و ، "بطريقة تعتمد على التنفيذ" ، bleh). وهو ما يعني ، في اللغة الإنجليزية العادية ، أنه سيحاول تطبيق المسار / اسم الملف الذي تقوم بإلقائه فيه ولن يقوم بملء مسار النظام أو العبث به بطريقة أخرى.

أيضًا ، إذا فشل #include "" ، فسيتم إعادة قراءته كـ #include <> حسب المعيار.

تحتوي g++ على وصف (خاص بالمتحول) والذي على الرغم من كونه مخصصًا لدول مجلس التعاون الخليجي وليس المعيار ، يكون من الأسهل فهمه أكثر من حديث أسلوب المحاماة لمعايير ISO.


على الأقل بالنسبة لإصدار GCC <3.0 ، لا يقوم نموذج قوس الزاوية بإنشاء تبعية بين الملف المضمن وبين الملف المرفق.

لذا إذا كنت تريد إنشاء قواعد التبعية (باستخدام خيار GCC -M للعرض) ، يجب استخدام النموذج المقتبس للملفات التي يجب تضمينها في شجرة التبعية.

(راجع http://gcc.gnu.org/onlinedocs/cpp/Invocation.html )


في C ++ ، تضمين ملف بطريقتين:

أول واحد هو تضمين # الذي يخبر المعالج الأولي للبحث عن الملف في الموقع الافتراضي المحدد مسبقًا. هذا الموقع هو غالباً متغير بيئة INCLUDE الذي يشير إلى المسار لتضمين الملفات.

والنوع الثاني هو #include "filename" الذي يخبر المعالج الأولي أن يبحث عن الملف في الدليل الحالي أولاً ، ثم يبحث عنه في المواقع المحددة مسبقًا التي قام المستخدم بإعدادها.


نعم هو كذلك:

"mypath/myfile" is short for ./mypath/myfile

مع . أن يكون إما دليل الملف حيث يوجد #include في ، و / أو دليل العمل الحالي للمجمع ، و / أو default_include_paths

و

<mypath/myfile> is short for <defaultincludepaths>/mypath/myfile

إذا كان ./ في <default_include_paths> ، فلن يحدث فارق.

إذا كان mypath/myfile في دليل تضمين آخر ، فإن السلوك غير معروف.


يتضمن <file> include المعالج الأولي للبحث في -I الأدلة وفي الدلائل المعرّفة مسبقًا أولاً ، ثم في ملف .c file. يتضمن "file" على المعالج الأولي البحث في دليل الملف المصدر أولاً ، ثم الرجوع إلى -I مسبق. يتم البحث عن جميع الوجهات على أي حال ، يختلف ترتيب البحث فقط.

يناقش معيار 2011 غالبًا ملفات التضمين في "تضمين ملف المصدر 16.2".

2 تعليمات مسبقة من النموذج

# include <h-char-sequence> new-line

يبحث عن تسلسل للأماكن المحددة للتنفيذ لرأس محدد بشكل فريد بالتسلسل المحدد بين <و> المحددات ، ويؤدي إلى استبدال هذا التوجيه بمحتويات الرأس بأكملها. كيفية تحديد الأماكن أو تحديد الرأس المحدد بالتنفيذ.

3 تعليمة مسبقة من النموذج

# include "q-char-sequence" new-line

يتسبب في استبدال هذا التوجيه بواسطة محتويات الملف المصدر المحددة بواسطة التسلسل المحدد بين "المحددات. يتم البحث عن الملف المصدر المحدد بطريقة محددة بالتطبيق. إذا لم يكن هذا البحث مدعومًا ، أو إذا فشل البحث ، إعادة معالجة التوجيه كما لو كان يقرأ

# include <h-char-sequence> new-line

مع التسلسل المتضمن المتضمن (بما في ذلك> الأحرف ، إن وجدت) من التوجيه الأصلي.

لاحظ أن نموذج "xxx" degrades إلى نموذج <xxx> إذا لم يتم العثور على الملف. الباقي هو تعريف التنفيذ.


يشير تسلسل الأحرف بين <و> بشكل فريد إلى رأس ، وهو ليس بالضرورة ملفًا. تكون التطبيقات حرة إلى حد كبير في استخدام تسلسل الأحرف كما تشاء. (في الغالب ، ومع ذلك ، فقط تعامله كاسم ملف وقم بالبحث في مسار التضمين ، كما هو الحال في حالة المشاركات الأخرى.)

إذا تم استخدام النموذج #include "file" ، فسيقوم التنفيذ أولاً بالبحث عن ملف الاسم المعطى ، إذا كان مدعومًا. إذا لم يكن (مدعوماً) ، أو إذا فشل البحث ، فسيعمل التنفيذ كما لو تم استخدام النموذج الآخر ( #include <file> ).

أيضًا ، يوجد نموذج ثالث ويتم استخدامه عندما لا يتطابق التوجيه #include مع أي من النموذجين أعلاه. في هذا النموذج ، يتم إجراء بعض المعالجة الأولية الأساسية (مثل توسيع الماكرو) على "المعاملات" الخاصة بتوجيه #include ، ومن المتوقع أن تتطابق النتيجة مع أحد النموذجين الآخرين.


تقول وثائق دول مجلس التعاون الخليجي ما يلي حول الفرق بين الاثنين:

يتم تضمين كل من ملفات رأس المستخدم والنظام باستخدام الأمر preprocessing '#include' . لديها اثنين من المتغيرات:

#include <file>

يتم استخدام هذا المتغير لملفات رأس النظام. يبحث عن ملف يسمى ملف في قائمة قياسية من دلائل النظام. يمكنك الإحاطة بالأدلة إلى هذه القائمة مع خيار -I (انظر Invocation ).

#include "file"

يستخدم هذا المتغير لملفات رأس البرنامج الخاص بك. يبحث عن ملف اسمه ملف أولاً في الدليل الذي يحتوي على الملف الحالي ، ثم في الدلائل إقتباس ومن ثم نفس الدلائل المستخدمة <file> . يمكنك توجيه الأدلة إلى قائمة دلائل الاقتباس مع خيار -iquote . تتصرف حجة '#include' ، سواء كانت محددة بعلامات اقتباس أو أقواس زاوية ، مثل ثابت سلسلة في تلك التعليقات غير معترف بها ، ولا يتم توسيع أسماء الماكرو. وبالتالي ، يحدد #include <x/*y> تضمين ملف رأس النظام المسمى x/*y .

ومع ذلك ، إذا حدثت خطوط مائلة عكسية داخل الملف ، فستعتبر أحرفًا نصية عادية ، وليست أحرف هروب. يتم معالجة أي من تسلسل الهروب حرف المناسبة ثوابت السلسلة في C. وبالتالي ، يحدد #include "x\n\\y" اسم ملف يحتوي على ثلاث خطوط مائلة عكسية. (تفسر بعض الأنظمة '\' كفاصل اسم مسار. كل هذه تفسر أيضًا '/' بنفس الطريقة. إنها أكثر قابلية للحمل للاستخدام فقط '/' .)

إنه خطأ إذا كان هناك أي شيء (بخلاف التعليقات) على السطر بعد اسم الملف.


#include <filename>

will find the corresponding file from the C++ library. it means if you have a file called hello.h in the C++ library folder, #include <hello.h> will load it.

لكن،

#include "filename"

will find the file in the same directory where your source file is.

In addition,

#include "path_to_file/filename"

will find the file in the directory which you typed in path_to_file .


The order of search header files is different. <XXX.h> prefer to search the standard headers first while "XXX.h" searches the workspace's header files first.


When you use #include <filename>, the pre-processor looking for the file in directtory of C\C++ header files (stdio.h\cstdio, string, vector, etc.). But, when you use #include "filename": first, the pre-processor looking for the file in the current directory, and if it doesn't here - he looking for it in the directory of C\C++ header files.


  #include <filename>   (1)     
  #include "filename"   (2)

#include تتضمن الملف المصدر ، الذي تم تحديده بواسطة اسم الملف ، في الملف المصدر الحالي في السطر مباشرة بعد التوجيه.

يتضمن الإصدار الأول من التوجيه البحث القياسي فقط الدلائل. يتم تضمين مكتبة C ++ القياسية ، وكذلك مكتبة C القياسية ، ضمنيًا في الدلائل القياسية وتشمل. المعيار تشمل أدلة يمكن التحكم من قبل المستخدم من خلال خيارات مترجم.

يبحث الإصدار الثاني أولاً الدليل حيث يوجد الملف الحالي و ، فقط إذا لم يتم العثور على الملف ، يبحث في الدلائل القياسية تتضمن.

في حالة عدم العثور على الملف ، يكون البرنامج غير سليم.


#include <abc.h>

يستخدم لتضمين ملفات المكتبة القياسية. لذا سيقوم المترجم بالتحقق من المواقع التي توجد بها عناوين مكتبة قياسية.

#include "xyz.h"

سيخبر المحول البرمجي لتضمين ملفات رأس المعرفة من قبل المستخدم. لذا سيقوم المترجم بالتحقق من وجود ملفات الرأس هذه في المجلد الحالي أو مجلدات محددة.


  • #include <> مخصص لملفات العناوين المحددة مسبقًا

إذا كان ملف الرأس محددًا مسبقًا ، فيمكنك ببساطة كتابة اسم ملف الرأس في أقواس معقوفة ، وسيبدو مثل هذا (بافتراض أن لدينا اسم iostream ذي رأس محدد مسبقًا):

#include <iostream>
  • #include " " مخصص لملفات رأس يحددها المبرمج

إذا كتبت (مبرمج) ملف رأسك الخاص ، فستكتب اسم ملف الرأس بين علامتي اقتباس. لذلك ، لنفترض أنك كتبت ملف رأس يسمى myfile.h ، فهذا مثال على كيفية استخدام توجيه التضمين لتضمين ذلك الملف:

#include "myfile.h"




c-preprocessor