سؤال

قد يكون هذا السؤال مكررة، لكن لا يمكنني العثور على إجابة جيدة. قصيرة وبسيطة، ما الذي يتطلب مني أن أعلن

using namespace std;

في برامج C ++؟

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

المحلول

نظرا لأن معيار C ++ قد تم قبوله، فإن جميع المكتبة القياسية هي عمليا داخل مساحة الاسم STD. لذلك إذا كنت لا ترغب في تأهل جميع مكالمات مكتبة قياسية std::, تحتاج إلى إضافة التوجيه باستخدام.

لكن،

using namespace std;

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

using std::string;

نصائح أخرى

لا شيء يفعل ذلك، إنه اختصار لتجنب البادئة كل شيء في مساحة الاسم هذه مع STD ::

من الناحية الفنية، قد تكون هناك حاجة لاستخدام استخدام (لاستبعاد الأسماء بأكملها أو أسماء فردية) لتتمكن من استخدام البحث المعتمد للوسيطة.

النظر في الوظائف التالية التي تستخدم swap().

#include <iostream>
#include <algorithm>

namespace zzz
{
    struct X {};


void swap(zzz::X&, zzz::X&) 
{
    std::cout << "Swapping X\n";
}
}

template <class T>
void dumb_swap(T& a, T& b)
{
    std::cout << "dumb_swap\n";
    std::swap(a, b);
}

template <class T>
void smart_swap(T& a, T& b)
{
    std::cout << "smart_swap\n";
    using std::swap;
    swap(a, b);
}

int main()
{
    zzz::X a, b;
    dumb_swap(a, b);
    smart_swap(a, b);

    int i, j;
    dumb_swap(i, j);
    smart_swap(i, j);
}

dumb_swap دائما يدعو std::swap - على الرغم من أننا نفضل أن نفضل استخدام zzz::swap ل zzz::X أشياء.

smart_swap يصنع std::swap مرئية كخيار خلفي للخروج (على سبيل المثال عند الاتصال بالمجلس الدولي)، ولكن نظرا لأنه لا يؤهل الاسم بالكامل، zzz::swap سيتم استخدامها من خلال ADL ل zzz::X.


ذاتي، ما يجبرني على استخدام using namespace std; هو كتابة التعليمات البرمجية التي تستخدم جميع أنواع كائنات الوظائف القياسية، إلخ.

//copy numbers larger than 1 from stdin to stdout
remove_copy_if(
    std::istream_iterator<int>(std::cin), std::istream_iterator<int>(),
    std::ostream_iterator<int>(std::cout, "\n"),
    std::bind2nd(std::less_equal<int>(), 0)
);

المنظمة البحرية الدولية، في كود مثل هذا std:: فقط يجعل الضوضاء الخط.

لن أجد using namespace std; جريمة بشعة في مثل هذه الحالات، إذا تم استخدامها في ملف التنفيذ (ولكن يمكن تقييدها على نطاق العمل، كما هو الحال في مثال المبادلة).

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

القدرة على الرجوع إلى الأعضاء في std مساحة الاسم دون الحاجة للإشارة إلى std::member صراحة. علي سبيل المثال:

#include <iostream>
using namespace std;

...
cout << "Hi" << endl;

ضد.

#include <iostream>

...
std::cout << "Hi" << std::endl;

بالتأكيد يجب أن لا تقول:

using namespace std;

في رؤوس C ++ الخاصة بك، لأن هذا يدق نقطة كاملة لاستخدام مساحات الأسماء (القيام بذلك من شأنها أن تشكل "تلوث مساحة الاسم"). بعض الموارد المفيدة في هذا الموضوع هي ما يلي:

1) الخيط stackoverflow على الاتفاقية القياسية لاستخدام "STD"

2) مقال بواسطة عشب سوتر الترحيل إلى أعمل الأسماء

3) الأسئلة الشائعة 27.5. من Marshall Cline's C ++ FAQ لايت.

أولاً، هذا غير مطلوب في ج - C ليس لديه مساحات الأسماء. في C ++، أي شيء في std مساحة الاسم التي تضم معظم المكتبة القياسية. إذا لم تقم بذلك، فعليك الوصول إلى أعضاء مساحة الاسم صراحة مثل:

std::cout << "I am accessing stdout" << std::endl;

أولا، using التوجيه مطلوب أبدا في C لأن C لا يدعم مساحات الأسماء على الإطلاق.

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

using namespace std;
string myString;

أي ما يعادل:

std::string myString;

ما إذا كنت تختار استخدامها أم لا هي مسألة تفضيلية، ولكن تعريض كامل std مساحة الاسم لحفظ عدد قليل من المفاتيح يعتبر بشكل عام شكل سيء. طريقة بديلة تكشف فقط عناصر معينة في مساحة الاسم هي كما يلي:

using std::string;
string myString;

هذا يسمح لك بفضح العناصر فقط في std مساحة الاسم التي تحتاجها بشكل خاص، دون خطر تعريض شيء لا تنوي عن غير قصد.

مساحات الأسماء هي وسيلة لفون رمز لتجنب الارتباك والأسماء من المتضاربة. علي سبيل المثال:

ملف common1.h:

namespace intutils
{
    int addNumbers(int a, int b)
    {
        return a + b;
    }
}

ملف الاستخدام:

#include "common1.h"    
int main()
{
    int five = 0;
    five = addNumbers(2, 3); // Will fail to compile since the function is in a different namespace.
    five = intutils::addNumbers(2, 3); // Will compile since you have made explicit which namespace the function is contained within.

    using namespace intutils;
    five = addNumbers(2, 3); // Will compile because the previous line tells the compiler that if in doubt it should check the "intutils" namespace.
}

لذلك، عندما تكتب using namespace std كل ما تفعله هو تخبر المحول البرمجي أنه في حالة شك في أنه يجب أن ننظر في std مساحة الاسم للوظائف، وما إلى ذلك، والتي لا تستطيع العثور على تعريفات ل. يستخدم هذا شائعا في المثال (والإنتاج) رمز ببساطة لأنه يجعل كتابة الوظائف الشائعة، إلخ. مثل cout أسرع من الاضطرار إلى التأهل الكامل لكل واحد std::cout.

لا تضطر أبدا إلى الإعلان عن استخدام مساحة الاسم STD؛ استخدامه هو ممارسة سيئة ويجب عليك استخدام STD :: إذا كنت لا ترغب في الكتابة STD :: دائما يمكنك القيام بشيء مثل هذا في بعض الحالات:

using std::cout;

باستخدام STD :: يمكنك أيضا معرفة أي جزء من البرنامج يستخدم المكتبة القياسية والتي لا. وهو ما هو أكثر أهمية أنه قد يكون هناك صراعات مع وظائف أخرى تتضمن.

rgds layne.

تعلن جميع الملفات في المكتبة القياسية C ++ جميع كياناتها داخل مساحة الاسم STD.
على سبيل المثال: لاستخدام cin,cout محددة في iostream

البدائل:

using std::cout;
using std::endl;
cout << "Hello" << endl;
std::cout << "Hello" << std::endl;

لا شيئ يستوجب يجب عليك القيام به - ما لم تكن مستفيدا من مكتبة C ++ القياسية وتريد تجنب ازدواجية التعليمات البرمجية عند تعريف ملفات الرأس في كل من "جديد" و "القديم":

// cstdio
namespace std
{
  // ...
  int printf(const char* ...);
  // ...
}

.

// stdio.h
#include <cstdio>
using namespace std;

حسنا، من مثال بالطبع مفترضة إلى حد ما (يمكنك استخدامه بشكل جيد بنفس القدر <stdio.h> ووضع كل شيء في STD في <cstdio>)، لكن بيارن ستروستروب يظهر هذا المثال في بلده لغة البرمجة C ++.

يتم استخدامه كلما كنت تستخدم شيئا تم إعلانه داخل مساحة الاسم. يتم الإعلان عن مكتبة C ++ القياسية داخل مساحة الاسم STD. لذلك عليك أن تفعل

using namespace std;

ما لم تكن ترغب في تحديد مساحة الاسم عند استدعاء الوظائف داخل مساحة اسم أخرى، مثل ذلك:

std::cout << "cout is declared within the namespace std";

يمكنك قراءة المزيد عنها في http://www.cplusplus.com/doc/tutorial/namespaces/.

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