لماذا عندما أقوم بإنشاء فصل دراسي c++ في Visual Studio 2013 من المعالج، لا أحتاج إلى تضمين رؤوس من stdafx.h
-
21-12-2019 - |
سؤال
لقد وجدت شيئًا غريبًا لا أستطيع تفسيره.عندما أستخدم معالج إنشاء الفصل في VS2013، فإنه سينشئ لي ملفات .h و.cpp على أساس فئة محددة.
مثال لملف الرأس:
#pragma once
class SomeClass
{
public:
SomeClass();
~SomeClass();
};
ثم أضفت بعض الاستخدامات.لقد قمت بتضمين رؤوس بمساحات الأسماء هذه في stdafx.يتم استخدام std وsf من SFML في تطبيقي:
#pragma once
using namespace std;
using namespace sf;
class SomeClass
{
public:
SomeClass();
~SomeClass();
};
وكل شيء يعمل بشكل جيد.لم يتم تضمين stdafx.h في ملف الرأس، فقط في .cpp.
ولكن بعد ذلك سأبدأ في الإنشاء اليدوي لملف الرأس (بدون .cpp) باستخدام نفس بنية الفئة:
#pragma once
using namespace std;
using namespace sf;
class SomeOtherClass
{
public:
SomeOtherClass();
~SomeOtherClass();
}
وهذا لا يعمل.يقول VS أنه لا يمكنه العثور على مساحة الاسم "sf"، ولكن لا توجد مشاكل مع مساحة الاسم "std".
وهذا هو الشيء الذي أريد أن أعرفه:لماذا الحالة الأولى صالحة وقد عثر VS على مساحات أسماء من الرؤوس المترجمة مسبقًا والحالة الثانية لا تعمل.
المحلول
لا يتم تجميع ملفات الرأس بمفردها أبدًا.فقط لك cpp
أو c
يتم تجميع الملفات ويتم نسخ ملفات الرأس إليها بواسطة المعالج المسبق عندما تقوم بذلك #include
هم.
وهذا يعني أنه إذا كانت جميع ملفات cpp التي قمت بتضمين رأس بها مساحات أسماء خاصة بك قبل تضمين الرأس، وسوف يعمل.لأن المترجم سيجد مساحات الأسماء قبل تجميع كود الرأس في هذا الملف.
إنها ليست ممارسة جيدة بالرغم من ذلك.يجب أن يعمل الرأس بمفرده ولا يعتمد على ملف cpp للقيام بشيء ما قبل التضمين.