سؤال بسيط حول إكراه نوع في C ++
سؤال
بالنظر إلى نموذج أولي للوظيفة ، وتعريف النوع:
int my_function(unsigned short x);
typedef unsigned short blatherskite;
هو الموقف التالي المحدد بواسطة Standard:
int main(int argc, char** argv) {
int result;
blatherskite b;
b=3;
result = my_function(b);
}
هل أحصل على إكراه من النوع بشكل متوقع عبر النموذج الأولي للوظيفة؟
المحلول
إذا كان سؤالك يدور حول ما إذا كانت أنواع الوسيطة ومطابقة المعلمة ، فإن الإجابة هي نعم. typedef
لا يقدم نوعًا جديدًا ، فهو يخلق فقط الاسم المستعار لنظام موجود. عامل b
لديه النوع unsigned int
, ، تماما مثل المعلمة ، على الرغم من b
يُعلن باستخدام Typedef-Name blatherskite
.
مثالك ليس جيدًا جدًا لإثبات ذلك. جميع الأنواع المتكاملة قابلة للتحويل لبعضها البعض في C ++ ، لذلك (تجاهل مشكلات النطاق) كان الرمز يحدد السلوك حتى لو blatherskite
تم تعيين نوع مختلف (نوع جديد). لكنه لا. لذلك هذا صحيح أيضا تماما
void foo(unsigned int* p);
...
blatherskite *pb = 0;
foo(pb); // <- still valid
نصائح أخرى
لا يوجد أي إكراه نوع. typedef هو مجرد الاسم المستعار لنفس النوع ، لذلك أنت تمر unsigned short
إلى وظيفة تأخذ unsigned short
.