سؤال

ما هو إشارة إلى الأمام في ج فيما يتعلق المؤشرات ؟

هل يمكنني أن أحصل على سبيل المثال ؟

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

المحلول

وانظر هذه الصفحة على <لأ href = "https://web.archive.org/web/20080314031412/http://h30097.www3.hp.com/docs/base_doc/DOCUMENTATION/V40F_HTML/AQTLTBTE/DOCU_024. HTM "يختلط =" نوفولو noreferrer "> يشير إلى الأمام . أنا لا أرى كيف الرجوع إلى الأمام سيكون مختلفا مع مؤشرات ومع أنواع الطباعة حسب الطلب الأخرى.

لاحظ أنه يمكنك توجيه يعلن أنواع، وتعلن المتغيرات التي هي مؤشرات إلى هذا النوع:

struct MyStruct;
struct MyStruct *ptr;
struct MyStruct var;  // ILLEGAL
ptr->member;  // ILLEGAL

struct MyStruct {
    // ...
};

// Or:

typedef struct MyStruct MyStruct;
MyStruct *ptr;
MyStruct var;  // ILLEGAL
ptr->member;  // ILLEGAL

struct MyStruct {
    // ...
};

وأعتقد أن هذا هو ما كنت طالبا عند التعامل مع مؤشرات وإعلان الأمام.

نصائح أخرى

وأعتقد أن "إشارة إلى الأمام" فيما يتعلق المؤشرات تعني شيئا مثل هذا:

struct MyStruct *ptr; // this is a forward reference.

struct MyStruct
{
  struct MyStruct *next; // another forward reference - this is much more useful
  // some data members
};

ويتم تعريف المؤشر قبل الهيكل يشير إلى ومحددة.

والمترجم يمكن أن تفلت من هذا لأن مخازن مؤشر عنوان، ولست بحاجة لمعرفة ما هو في ذلك عنوان لحجز الذاكرة لمؤشر.

إلى الأمام المرجع هو عندما تقوم بتعريف نوع ولكن لا تحدد ذلك.

فإنه يسمح لك استخدام نوع من المؤشر (أو مرجعية C++) ولكن لا يمكنك تعريف متغير.

هذا هو وسيلة إلى القول أن المترجم أن شيئا ما موجود

أقول أن لديك أسقط بنية المعرفة في صوت نزول المطر.ح:

struct Plop
{
   int n;
   float f;
};

الآن كنت ترغب في إضافة بعض الوظائف ذات المنفعة التي تعمل مع هذه البنية.يمكنك إنشاء ملف آخر PlopUtils.ح (دعنا نقول لا يمكنك تغيير صوت نزول المطر.h):

struct Plop; // Instead of including Plop.h, just use a forward declaration to speed up compile time

void doSomething(Plop* plop);
void doNothing(Plop* plop);

الآن عند تنفيذ هذه المهمة, سوف تحتاج إلى بنية التعريف ، لذلك تحتاج إلى تدرج نزول المطر.ح في ملف PlopUtils.cpp:

#include "PlopUtils.h"
#include "Plop.h" // now we need to include the header in order to work with the type

void doSomething(Plop* plop)
{
   plop->n ...
}

void doNothing(Plop* plop);
{
   plop->f ...
}

وأعتقد كان المترجم C أصلا تمريرة الذي فعلت بناء جدول الرموز والتحليل الدلالي معا. هكذا على سبيل المثال:

    ....
    ... foo(a,b) + 1 ... // assumes foo returns int
    ....

    double foo(double x, double y){ ... } // violates earlier assumption

ولمنع هذا، ويقول لك:

    double foo(double x, double y); // this is the forward declaration

    ....
    ... foo(a,b) + 1 ... // correct assumptions made
    ....

    double foo(double x, double y){ ... } // this is the real declaration

وكان باسكال نفس المفهوم.

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

struct foo;

struct bar
{
   struct foo *f;
};

struct foo
{
   struct bar *b;
};

ويشير إلى الأمام تسمح C مترجم للقيام أقل يمر، ويقلل كثيرا من الوقت لجمع البيانات. ربما هو كان من المهم قبل نحو 20 عاما عندما كانت أجهزة الكمبيوتر أبطأ والمطيعون بكثير أقل كفاءة.

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