وجود نفس الوظيفة في ملفات مصدر C متعددة

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

  •  25-08-2022
  •  | 
  •  

سؤال

أواجه صعوبة في معرفة لماذا لا يمكنني الحصول على نفس الوظيفة في العديد من ملفات مصدر C. اعتقدت دائمًا أنه لا يمكنني الوصول إلى وظائف في ملف مصدر آخر طالما لم يتم الإعلان عنه في ملف رأس.

لنفترض أن لدي ما يلي:

Main.C -> يتضمن thread1.h & thread2.h

thread1.h -> يعلن على سبيل المثال void * thread1 () ؛

Thread1.c -> يحدد void * thread1 () {} ويحدد قفل void () {}

thread2.h -> يعلن على سبيل المثال void * thread2 () ؛

thread2.c -> يحدد void * thread2 () {} ويحدد قفل void () {}

الآن يخبرني GCC أنني لا أستطيع فعل ذلك!

gcc -pthread -wall -o القابلة للتنفيذ main.c thread1.c thread2.c

خطأ: تعريف متعدد "القفل"

لذا سؤالي الآن هو:كيف يمكنني إنجاز ما أريد؟

لا أعتقد أن هذا من المفترض أن يكون مستحيلًا. وإلا فإن كل رمز المصدر C المتاح في جميع مكتبات C العديدة يجب أن يكون فريدًا. (ناه لن يكون له معنى ، أم هل؟)

لذلك فكرت في نفسي منذ حوالي 3 ساعات أنه يجب أن يكون هناك حل. يجب أن أفتقد شيئًا هنا.

حسنًا ، لقد جربت غوغلينغ ... لكن مهاراتي في Google لم تساعدني هذه المرة. هل حقا لا توجد طريقة للقيام بذلك؟ أو هل أنا فقط أغبي للبحث عنه؟

شكرا مقدما،

لعة

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

المحلول

ستحتاج إلى هذه الوظيفة lock() أن تكون static.

static void lock() {..}

السبب هو أن يعمل مع static غير مرئية خارج "وحدة الترجمة". بكلمات أخرى (ربما خاطئة) ، الوظائف الثابتة خاص إلى ملف *.c. وبالتالي ، فهي لا تسبب ربط الأخطاء في مرحلة الارتباط ، كما تواجه حاليًا.

نصائح أخرى

يجب أن تعلن قفلًا static void lock(){}.

وإلا فإن اسم الوظيفة سيكون مرئيًا في جميع أنحاء البرنامج وستحصل على تصادم اسم (على الرغم من أنك لا تزال قادرًا على الاتصال به بدون نموذج أولي للوظيفة).

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