لماذا عندما أقوم بإنشاء فصل دراسي c++ في Visual Studio 2013 من المعالج، لا أحتاج إلى تضمين رؤوس من stdafx.h

StackOverflow https://stackoverflow.com//questions/25028808

سؤال

لقد وجدت شيئًا غريبًا لا أستطيع تفسيره.عندما أستخدم معالج إنشاء الفصل في 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 للقيام بشيء ما قبل التضمين.

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