السلام عليكم
ماذا تعني كلمة static
عندما نقوم بتعريف متغير عام gloabl
؟
؟
السلام عليكم
ماذا تعني كلمة static
عندما نقوم بتعريف متغير عام gloabl
؟
؟
دولة الخلافة الاسلامية في المخاض الاخير وميلادها قريب
حزب التحرير : التزم الطريق الصحيح الشرعي الوحيد لاعادة دولة الخلافة الاسلامية .
الامة الاسلامية متعطشة لقيادة مخلصة لتذوق حلاوة النصر ولن يكون ذلك الا بعودة الخلافة الاسلامية
الامة الاسلامية تحتاج لاحداث تسحقها سحقا وتمعسها معسا لتفكر تفكيرا جماعيا بالتغير لان وحدة المشاعر لوحدها لاتكفي وهذة الاحداث كلها خير
static int x;
// int x;
int main(){
return 0;
}لا فرق, كل ما في الأمر أن الـ static هو الـ default عندما يكون عاماً ....
عندما تكتب :
int main(){
int x;
return 0;
}هنا x داخل دالة, و بالتالي فإنه يتم حجز الذاكرة له وقت التشغيل من الـ run-time stack, بينما في المثال الأول فإن المتغيرات العامة تكون في قسم الـ Data للبرنامج التنفيذي... و إذا أردنا جعل المتغير x الموجود داخل main
ضمن الـ Data فنعرفه على أنه static ....
تحياتي ..
تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 4 مايو 2009 في 15:48
Thanx alot Khaled!
دولة الخلافة الاسلامية في المخاض الاخير وميلادها قريب
حزب التحرير : التزم الطريق الصحيح الشرعي الوحيد لاعادة دولة الخلافة الاسلامية .
الامة الاسلامية متعطشة لقيادة مخلصة لتذوق حلاوة النصر ولن يكون ذلك الا بعودة الخلافة الاسلامية
الامة الاسلامية تحتاج لاحداث تسحقها سحقا وتمعسها معسا لتفكر تفكيرا جماعيا بالتغير لان وحدة المشاعر لوحدها لاتكفي وهذة الاحداث كلها خير
السلام عليكم
اقتباسلا فرق, كل ما في الأمر أن الـ static هو الـ default عندما يكون عاماً ....
هل ينطبق هذا الكلام على الدوال العامة؟
تم تعديل هذه المشاركة بواسطة MoHammaD_93 في 26 مايو 2009 في 11:58
SAFETY TIP : Always delete what you new, and free what you malloc, never mix new with free or malloc with delete.
ما أعرفه أن static تستخدم مع المتغيرات والدوال العامة لمنع استخدامهما من خارج الملف المصدري الحالي
وهذا نص قرأته في أحد المواقع
Static Objects
The keyword static has many meanings and uses in the C language. When applied to a variable, it means the variable is only visible within the current source code file being compiled. When applied to a function, it means that function can only be used within the current source code file. When applied to a variable inside a function, it means that the variable persists from one call of that function to next: it is global data masquerading as a local variable (a thing to be avoided).
regards
تم تعديل هذه المشاركة بواسطة MoHammaD_93 في 26 مايو 2009 في 11:55
SAFETY TIP : Always delete what you new, and free what you malloc, never mix new with free or malloc with delete.
السلام عليكم ...
اقتباسما أعرفه أن static تستخدم مع المتغيرات والدوال العامة لمنع استخدامهما من خارج الملف المصدري الحالي
هذه النقطة مربكة قليلاً بالفعل :)
تابع معي ...
static لها معاني كثيرة, و تعتمد على السياق الذي تستخدم هذه الكلمة فيها .....
إذا تحدثنا عن المتغيرات, و أقصد المتغيرات المعرفة خارج نطاق الدوال أو الأصناف Classes ... فإن المثال التالي سيوضح المعنى ::
int x = 4;
int main()
{
return 0;
}و هذا المثال ::
static int x = 4;
int main()
{
return 0;
}متساويان تماماً, لأن المتغيرات العامة بطبيعتها تكون في قسم الـ Data للبرنامج, و يتم حجز الذاكرة لها ضمن الملف التنفيذي, و هذا النوع من الذاكرة يعرف بالـ Static.... تسمى Static ببساطة لأنه عملية الحجز تتم وقت الترجمة, أي أن الذاكرة لا تحجز وقت تشغيل البرنامج...
الآن تصور أننا قمنا بإنشاء ملفين:: الأول يسمى decl.h و الثاني يسمى main.cpp ....
//decl.h int x = 5;
إضافة إلى الملف الثاني ::
//main.cpp
#include "decl.h"
int main()
{
x++;
return 0;
}يمكنك استدعاء x بكل بساطة من الملف main.cpp ... كما ترى لايوجد ما يمنع... لأنه عند ترجمة main.cpp فإن main.cpp سيأخذ الشكل التالي ::
//decl.h is replaced by the preprocessor :)
int x;
int main()
{
x++;
return 0;
}حسناً إلى الآن كل الأمور واضحة إن شاء الله..... المشكلة الوحيدة التي تظهر و التي أعتقد أن يظهر فيها بعض الغموض, هي لو أننا قمنا بتعريف الملفين المذكورين سابقاً على الشكل التالي ::
//decl.h
int func() { return x*x; };ثم قمنا بتعريف main.cpp كالتالي ::
//main.cpp
#include "decl.h"
int x = 5;
int main()
{
x = func();
return 0;
}هل ترى أين عرفنا x !! عرفناها بعد عملية تضمين الملف decl.h ... عندما سيقوم المترجم بعملية ترجمة الدالة func فإنه لم يحصل بعد على تعريف المتغير x ... و هنا سيصدر لك خطأ بأنك تقوم باستخدام متغير غير معرف أصلاً,
و لكننا كما ترى نريد أن نقول للمترجم أن ما نقصده بـ x حقيقة هو المتغير الموجود في الملف main.cpp ... كيف سنفعل ذلك ؟
هناك شيء من لغة C يسمى extern ... انظر إلى decl.h بعد التعديل ::
//decl.h
extern int x;
int func() { return x*x; };كما ترى قمنا باستخدام الكلمة extern ملحقة بالمتغير الذي نريد استخدامه, المترجم عندما يصل الدالة func فإنه سيترك المتغير, و يدع المهمة للـ linker لكي يقوم بجلب عنوان x الحقيقي .... :)
هذا كل مالدي .. أتمنى أن يكون واضحاً :)
على العموم ++C/C ليست سهلة, تحتاج إلى قليل من الصبر و فهم القليل من التاريخ وراء كون اللغة على ماهي عليه ....
تحياتي ..
تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 26 مايو 2009 في 19:08
السلام عليكم،،
ليس هذا أبداً ما أقصده.
استخدام static مع الدوال والمتغيرات العامة هو عند العمل على أكثر من ملف
في ردك الأخير كنت تتكلم عن العمل على ملف مصدري واحد فقط
---------------------------------------------------
لنفترض أنه لديك البرنامج التالي
وملف آخر
هل تتوقع بأي حال من الأحوال أن هذا الكود سوف تتم ترجمته
حتما لااا
الآن يأتي دور الكلمة المحجوزة static لتفصل الدالتين والمتغيرين في كلا الملفين عن بعض
هنا نستنتج أن الكلمة static ليست افتراضية لا بالنسبة للمتغيرات ولا للدوال
/////// ملاحظة: الكود السابق تمت تجربته على VC++2008
أطيب التحيات
والسلام عليكم
SAFETY TIP : Always delete what you new, and free what you malloc, never mix new with free or malloc with delete.
السلام عليكم ...
هناك خطأ في مثالك أخي الكريم :)
لا يوجد إلا مجال عام واحد global scope و لا يجوز إعادة تعريف متغير, سواء في نفس الملف أو في ملف آخر, و extern هذه من إرث C لذلك هذه الإشكالية في ترتيب الملف المضمن ضمن ملف آخر إذا أردنا استعمال متغير من ملف آخر...
و بالتالي مثالك خاطئ لأنك قمت بإعادة تعريف المتغير x مرة أخرى,
و حتى لو عرفت المتغير على أنه static فكما قلت لك فهو لا يؤثر لأنه الـ Storage Class الوحيد المقبول للمتغيرات العامة افتراضياً :)
الأمر الآخر ....
أنا لم أعلق على معنى static عندما تلحق تعريف الدوال :) و قلت أن لها أكثر من معنى في أكثر من سياق....
تحياتي ..
تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 26 مايو 2009 في 22:03
السلام عليكم ....
أخ MoHammaD_93, حتى أكون معك صريحاً لم أستخدم static في حياتي لتعريف دالة أو متغير في مجال عام :)
عموماً الآن اتضحت لي الرؤية .... أعتقد أنه عند عمل Linking فإن المتغيرات أو الدوال لاتكون ظاهرة خارج الـ linking unit إذا كانت معرفة على أنها static :huh:
أنا الغموض لدي كان في أن المتغيرات العامة بالفعل هي static, و المقصود بـ static هو الـ storage class الخاصة بها,
بينما إذا أضفنا لها static فإنها تصبح ظاهرة فقط ضمن الـ linking unit التي نقوم بترجمتها!
للأسف لا أستخدم C, كل ما أفعله هو استخدام namespaces أينما ذهبت :)
شكراً على المعلومة عموماً :)
تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 26 مايو 2009 في 23:26
اقتباسشكراً على المعلومة عموماً
لطالما استفدتُ من علمك ومشاركاتك القيمة في المنتدى
يحلو النقاش معك أخي الكريم
أطيب تحياتي
والسلام عليكم
SAFETY TIP : Always delete what you new, and free what you malloc, never mix new with free or malloc with delete.