ج: الاختلافات بين إعلان النموذج الأولي في رأس وإعلان الوظيفة للتنفيذ؟

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

  •  23-08-2019
  •  | 
  •  

سؤال

كنت أتساءل عن الاختلافات الصغيرة بين إعلان النماذج الأولية الوظيفية في رؤوس وملفات .C. لدي رأس مع بعض وظائف النموذج الأولي وبعض ملفات .C مع التنفيذ الحقيقي لهذه الوظائف. لقد قمت ببعض التغييرات في الرأس، وأضاف فقط "__restrict" التصفيات (المعترف بها من قبل دول مجلس التعاون الخليجي). سؤالي هو هل يجب علي وضع مؤهل "__restrict" في ملفات .c إلى (حاليا Compile Compile لذلك أعتقد أن الإجابة لا، ولكن سيتم تقدير بعض الدقة).

هل هذا يعمل لكل مؤهل C؟ هل يمكنني إضافة بعض "CONS" أو "متقلبة" في الرأس دون الحاجة إلى القيام بنفس الشيء في ملفات .c؟

حاليا في رأس:

int myfunc_gettype (const mytype *__restrict, int *__restrict);

وفي ملف التنفيذ:

int myfunc_gettype(const mytype *attr, int *type)
هل كانت مفيدة؟

المحلول

أنت يجب. وبعد عدم التطابق يستدعي السلوك غير محدد. هل هناك بعض الأسباب التي تجعلك ترغب في الحصول على إعلانات منفصلة في الرأس وتعريفها؟

لاحظ جيدا، أن الكلمة الأساسية هي restrict في مقابل __restrict وهو ملحق البائع (تلميح: انظر إلى _قبل اسم الكلمة الرئيسية). يجب أن تلتصق بالنسخة القياسية لتحميل.

نصائح أخرى

مع دول مجلس التعاون الخليجي 4.0.1، يعتمد ذلك على ما إذا كان CONST لا معنى له:

// Who cares, compiles fine, but irks the maintenance programmer.

// f.h
int f(const int i);

// f.c
int f(int i) { return i += 42; }


// No no no no Your Types Conflict gcc will not stand for it

// f.h
int f(const int *pi);

// f.c
int f(int *pi) { return (*pi)+= 42; }

ملاحظة: لم تقم بإضافة مؤهل "تقييد". لديك فقط أسماء متغيرة مختلفة (اختيارية) في النموذج الأولي.

فيما يتعلق بسؤالك، سيقوم معظم المترجمين C جيدة بالقبض على هذا الخطأ ورمي تحذير / خطأ في حالة قيام النموذج الأولي غير المطابق بالتنفيذ. إذا كانت لديك عدم تطابق النماذج الأولية، فقد ترى مشاكل تتراوح من خفية إلى تحطم فوري.

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