سؤال

عند تضمين ملف رأس في C++، ما الفرق بين...

1) تضمين .h مقابل عدم تضمين .h عند تغليفه بالعلامات < >؟

#include <iostream> vs. #include <iostream.h>

2) تغليف اسم الرأس بين علامتي اقتباس مزدوجتين مقابل تغليفه بعلامات < >؟

#include <iostream.h> vs. #include "iostream.h"

شكرا لك مقدما!

هل كانت مفيدة؟

المحلول

وباختصار:

وتم إهمال iostream.h - هو إصدار Stroustrup الأصلي، وiostream هو نسخة من لجنة المعايير. المجمعين عموما تشير لهم على حد سواء إلى نفس الشيء، ولكن بعض المجمعين القديمة قد لا يكون واحد من كبار السن. في بعض الحالات الفردية التي على حد سواء الوجود وتكون مختلفة (لدعم قانون الإرث)، وكنت ثم يجب أن تكون محددة.

"" مقابل <> يعني ببساطة تحقق الدلائل المحلية للرأس قبل أن يذهب إلى المكتبة (في معظم المجمعين).

و-Adam

نصائح أخرى

وهنا هو وجود صلة لائق المادة.

لتلخيص، والسبب الممنوحة:

<اقتباس فقرة>   

وإصدار مكتبة iostream أن لجنة المعايير   وتنتج قدرا كبيرا يختلف عن تنفيذ CFront.   {قص}

     

لتسهيل عملية الانتقال، أعلنت لجنة المعايير ++ C هذا الرمز   بما في ذلك معيار C ++ رؤوس ستستخدم تشمل توجيهات   تفتقر إلى التمديد. وهذا ما سمح البائعين مترجم إلى السفينة النمط القديم   C ++ رؤوس مكتبة مع تمديد .H ورؤوس نمط جديد   دون.

وميزة عدم استخدام النسخة .H:

<اقتباس فقرة>   

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

وأما الشخص في لجنة المعايير (X3J16) الذي اقترح ترك إيقاف. ح، كان هدفي الأصلي لتسوية الجدل حول .H، .H، .hpp، .hxx، أو .H ملحقات الملفات ++؛ أو رغبة البعض أن يكون هناك تورط في مستوى أن هذا هو اسم ملف على القرص من أجل السماح لIDE لسحب معلومات رأس قبل تجميعها من مكان داخلي مثل ملف مورد أو حتى الشجاعة لل مترجم.

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

والتفريق بين المعيار ورؤوس مسبقا القياسية كان ميزة إضافية.

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

و"iostream.h" سيحاول أولا من الدليل مع شفرة المصدر الخاصة بك، منذ "" هو المقصود لرؤوس من المشروع. <> يجب دائما أن تستخدم لرؤوس النظام، و "" لرؤوس الخاصة بك.

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

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

هذان سؤالان مختلفان حقًا.

  • الفرق بين .H والرؤوس بدون تمديد مع نفس الاسم هو تاريخي.تلك التي تحتوي على امتداد .H هي من معيار C ++ الأصلي الذي لم يكن لديه بعض الميزات الحديثة مثل مساحات الأسماء والقوالب.كان من السهل بالنسبة للمعايير الجديدة أن تضع نفس الوظيفة في ملفات الرأس الجديدة لتتمكن من استخدام هذه الميزات الجديدة والحفاظ على الملفات القديمة (.H) للتوافق مع الكود القديم.

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

والجواب البسيط إلى الإجابة الأولى هي أن iostream.h لا وجود له، على الأقل في تنفيذ دول مجلس التعاون الخليجي. إذا كنت على * لا شىء، نوع

و٪ تحديد iostream.h
/ البيرة / وتشمل / ج ++ / 3.4.3 / الخلف / iostream.h

و

و٪ تحديد iostream
/usr/include/c++/3.4.3/iostream
/ البيرة / وتشمل / ج ++ / 3.4.3 / الخلف / iostream.h

وكما تقول المادة زي، وiostream.h هو من أجل التوافق مع الإصدارات السابقة.

وفيما يتعلق أسماء الملفات رأس القياسية C ++، في الأيام الأولى (2 السنوات الأولى) من X3J16، واجهنا حجة على ما ينبغي أن يكون التمديد على رأس الملفات القياسية C ++. المستخدمة في ذلك الوقت من قبل مختلف البائعين (وتتأثر القيود التي بعض أنظمة التشغيل وضعت على أسماء الملفات) وأعتقد أن هناك .H، .H، .H ++، .hpp، .HXX، وربما آخرين. في اجتماع مجموعة مكتبة اقترحت أن نترك تمديد خارج، وترك الأمر للتنفيذ إلى توفير ملحق الملف الافتراضي من اختيارها إذا كان هناك شيء في التضمين الخط، أو استخدام اسم كمفتاح في قاعدة بيانات رأس الملفات قبل تجميعها إذا رغبت في ذلك. [بينما أنظمة يونكس مثل تعامل اسم الملف و"تمديد" كسلسلة واحدة، وكنت تمثل ديسمبر في اللجنة، والعديد من أنظمة التشغيل ديسمبر تخزين التمديد في الدليل كحقل مستقل من الاسم. حتى ديسمبر كان أنظمة التشغيل تقليد قوي من تطبيق الملحق الافتراضي بناء على ما البرنامج كان الوصول إلى الملف لأي غرض. قال في المجمع 'X، Y = Z' قد يؤدي في قراءة ملف الإدخال Z.MAC (ماكرو) وكتابة ملفات الإخراج X.OBJ وY.LST.] على أي حال، فإنه تجنب طويلة، عدم فوز النقاش، وبالتالي فإن مجموعة ذهب جنبا إلى جنب معها، وقدم اندي كونيغ استنتاجات المجموعة على هذا (وغيرهم) إلى لجنة بأكملها التي قبلها. أجد أنها مسلية بعض الشيء أن تطبيقات غاب عن بيت القصيد يتمكنوا من تطبيق الملحق الافتراضي من اختيارهم (والتي أعتقد أن سيكون من المفيد للمحررين وغيرها من الأدوات) ومجرد ترك تمديد الخروج من اسم الملف.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top