سؤال

معنى كل من يتملص لي.

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

المحلول

A إعلان يدخل معرف و يصف نوع ، سواء كان نوع الكائن أو وظيفة.الإعلان ما يحتاج مترجم لقبول إشارات إلى أن المعرف.هذه هي الإعلانات:

extern int bar;
extern int g(int, int);
double f(int, double); // extern can be omitted for function declarations
class foo; // no extern allowed for type declarations

A تعريف فعلا instantiates/تنفذ هذا المعرف.انها ما يحتاج رابط من أجل ربط الإشارات إلى تلك الكيانات.هذه هي التعاريف المقابلة أعلاه الإعلانات:

int bar;
int g(int lhs, int rhs) {return lhs*rhs;}
double f(int i, double d) {return i+d;}
class foo {};

تعريف يمكن استخدامها في مكان من الإعلان.

معرف يمكن أعلن في كثير من الأحيان كما تريد.وهكذا ، وفيما يلي القانونية في C و C++:

double f(int, double);
double f(int, double);
extern double f(int, double); // the same as the two above
extern double f(int, double);

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


لأن النقاش ما هي فئة إعلان مقابلفئة تعريف في C++ يبقى الخروج (في الردود والتعليقات على الأسئلة الأخرى) سوف لصق اقتباس من C++ القياسية هنا.
في 3.1/2, C++03 يقول:

الإعلان هو تعريف ما لم [...] هو اسم الفئة الإعلان [...].

3.1/3 ثم يعطي أمثلة قليلة.من بينها:

[Example: [...]
struct S { int a; int b; }; // defines S, S::a, and S::b [...]
struct S; // declares S
—end example

وباختصار:C++ القياسية ترى struct x; أن يكون إعلان و struct x {}; a تعريف.(وبعبارة أخرى ، "إلى الأمام إعلان" تسمية خاطئة, ، حيث لا توجد أشكال أخرى من فئة الإعلانات في C++.)

شكرا litb (يوهانس شواب) الذين حفرت الفعلية الفصل والآية في واحدة من إجاباته.

نصائح أخرى

من C++ القياسية القسم 3.1:

A إعلان يدخل الأسماء إلى وحدة الترجمة أو redeclares أسماء عرضه السابق إعلانات.إعلان يحدد تفسير سمات هذه الأسماء.

الفقرة التالية الدول (التشديد من الألغام) أن الإعلان هو تعريف إلا إذا...

...تعلن وظيفة دون تحديد وظيفة الجسم:

void sqrt(double);  // declares sqrt

...تعلن ثابت عضو ضمن فئة التعريف:

struct X
{
    int a;         // defines a
    static int b;  // declares b
};

...ويعلن اسم فئة:

class Y;

...أنه يحتوي على extern الكلمة دون مهيئ أو وظيفة الجسم:

extern const int i = 0;  // defines i
extern int j;  // declares j
extern "C"
{
    void foo();  // declares foo
}

...أو هو typedef أو using البيان.

typedef long LONG_32;  // declares LONG_32
using namespace std;   // declares std

الآن سبب كبير لماذا من المهم أن نفهم الفرق بين الإعلان و التعريف:على واحد تعريف القاعدة.من قسم 3.2.1 C++ القياسية:

لا وحدة الترجمة يجب أن تحتوي على أكثر من تعريف أي متغير أو دالة من الدرجة نوع, نوع التعداد ، أو القالب.

والإعلان: "في مكان ما، يوجد هناك فو"

والتعريف: "... وهنا هو!"

وهناك حالات مثيرة للاهتمام حافة في C ++ (بعضهم في C أيضا). النظر

T t;

ويمكن أن يكون تعريف أو إعلان، اعتمادا على ما T نوع هو:

typedef void T();
T t; // declaration of function "t"

struct X { 
  T t; // declaration of function "t".
};

typedef int T;
T t; // definition of object "t".

في C ++، عند استخدام القوالب، وهناك قضية أخرى الحافة.

template <typename T>
struct X { 
  static int member; // declaration
};

template<typename T>
int X<T>::member; // definition

template<>
int X<bool>::member; // declaration!

وكان الإعلان الأخير <م> لا تعريف. انها الإعلان عن التخصص صريح من عضو ثابت من X<bool>. وهو يروي مترجم: "اذا وصل الامر الى instantiating X<bool>::member، ثم لا مثيل تعريف عضو من القالب الأساسي، ولكن استخدام تعريف جدت في مكان آخر". لجعله تعريف، لديك لتزويد مهيئ

template<>
int X<bool>::member = 1; // definition, belongs into a .cpp file.

إعلان

الإعلانات نخبر المترجم أن برنامج العنصر أو اسم موجود.A إعلان يدخل واحد أو أكثر أسماء في البرنامج.الإعلانات يمكن أن تحدث أكثر من مرة في البرنامج.ولذلك ، الطبقات ، والهياكل ، الأنواع السردية الأخرى الأنواع المعرفة من قبل المستخدم يمكن أن تكون أعلنت عن كل تجميع وحدة.

تعريف

تعريفات تحديد أي رمز أو بيانات اسم يصف.الاسم يجب أن يكون أعلن قبل استخدامها.

من C99 القياسية ، 6.7(5):

إعلان يحدد تفسير سمات مجموعة من المعرفات.A تعريف من المعرف هو الإعلان عن أن معرف:

  • لكائن يسبب تخزين محفوظة هذا الكائن ؛
  • للحصول على وظيفة ، يتضمن وظيفة الجسم ؛
  • من أجل التعداد ثابتة أو الرموز المميزة ل typedef الاسم هو (فقط) إعلان المعرف.

من C++ القياسية ، 3.1(2):

الإعلان هو تعريف ما لم تعلن وظيفة دون تحديد وظيفة الجسم, وهو يحتوي على extern محدد أو الربط-مواصفات ولا مهيئ ولا وظيفة الجسم ، فإنها تعلن بيانات ثابتة الأعضاء في فئة الإعلان ، بل هو اسم الفئة إعلان أو الرموز المميزة ل typedef الإعلان ، باستخدام الإعلان أو استخدام التوجيه.

ثم هناك بعض الأمثلة.

لذلك من المثير للاهتمام (أو لا لكن أنا فوجئت قليلا قبل ذلك) ، typedef int myint; هو تعريف في C99, ولكن فقط إعلان في C++.

ومن wiki.answers.com:

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

وعلى سبيل المثال، فيما يلي جميع الإعلانات:

extern int a; 
struct _tagExample { int a; int b; }; 
int myFunc (int a, int b);

والوضوح من ناحية أخرى يعني أنه في الإضافات إلى كل الأشياء التي لا إعلان، محجوز الفضاء أيضا في الذاكرة. يمكنك أن تقول "تعريف = إعلان + حجز SPACE" فيما يلي أمثلة من تعريف:

int a; 
int b = 0; 
int myFunc (int a, int b) { return a + b; } 
struct _tagExample example; 

أجوبة .

C++11 التحديث

منذ أنا لا أرى إجابة ذات الصلة C++11 هنا واحد.

الإعلان هو تعريف ما لم يعلن a/n:

  • مبهمة enum - enum X : int;
  • قالب معلمة - T في template<typename T> class MyArray;
  • المعلمة الإعلان - x و y في int add(int x, int y);
  • الاسم المستعار الإعلان - using IntVector = std::vector<int>;
  • ثابت تأكيد الإعلان - static_assert(sizeof(int) == 4, "Yikes!")
  • السمة إعلان (تنفيذ-المعرفة)
  • إعلان فارغ ;

شروط إضافية الموروثة من C++03 من القائمة أعلاه:

  • وظيفة الإعلان - إضافة في int add(int x, int y);
  • extern محدد يتضمن الإعلان أو الربط محدد - extern int a; أو extern "C" { ... };
  • بيانات ثابتة الأعضاء في الصف - x في class C { static int x; };
  • الصف/البنية الإعلان - struct Point;
  • الرموز المميزة ل typedef الإعلان - typedef int Int;
  • استخدام الإعلان - using std::cout;
  • باستخدام التوجيه using namespace NS;

قالب الإعلان هو الإعلان.قالب الإعلان أيضا التعريف إذا كان الإعلان يحدد وظيفة ، فئة ، أو بيانات ثابتة الأعضاء.

أمثلة من المعيار الذي يميز بين الإعلان و التعريف الذي وجدته مفيدا في فهم الفروق بينهما:

// except one all these are definitions
int a;                                  // defines a
extern const int c = 1;                 // defines c
int f(int x) { return x + a; }          // defines f and defines x
struct S { int a; int b; };             // defines S, S::a, and S::b
struct X {                              // defines X
    int x;                              // defines non-static data member x
    static int y;                       // DECLARES static data member y
    X(): x(0) { }                       // defines a constructor of X
};
int X::y = 1;                           // defines X::y
enum { up , down };                     // defines up and down
namespace N { int d; }                  // defines N and N::d
namespace N1 = N;                       // defines N1
X anX;                                  // defines anX


// all these are declarations
extern int a;                           // declares a
extern const int c;                     // declares c
int f(int);                             // declares f
struct S;                               // declares S
typedef int Int;                        // declares Int
extern X anotherX;                      // declares anotherX
using N::d;                             // declares N::d


// specific to C++11 - these are not from the standard
enum X : int;                           // declares X with int as the underlying type
using IntVector = std::vector<int>;     // declares IntVector as an alias to std::vector<int>
static_assert(X::y == 1, "Oops!");      // declares a static_assert which can render the program ill-formed or have no effect like an empty declaration, depending on the result of expr
template <class T> class C;             // declares template class C
;                                       // declares nothing

وتعريف يعني ظيفة فعلية مكتوبة وإعلان تعني وظيفة تعلن بسيطة على سبيل المثال؛

void  myfunction(); //this is simple declaration

و

void myfunction()
{
 some statement;    
}

وهذا هو تعريف وظيفة myfunction

سيادة الإبهام:

  • A إعلان يقول المترجم كيفية تفسير بيانات المتغير في الذاكرة.هذا هو اللازم لكل من الوصول.

  • A تعريف تحتفظ الذاكرة لجعل المتغير القائمة.هذا يجب أن يحدث مرة واحدة فقط قبل الوصول الأول.

إعلان :

int a; // this declares the variable 'a' which is of type 'int'

وبالتالي إعلان الزميلة متغير مع نوع.

وفيما يلي بعض الأمثلة على الإعلان.

int a;
float b;
double c;

الآن وظيفة الإعلان :

int fun(int a,int b); 

لاحظ الفاصلة المنقوطة في نهاية الدالة لذلك يقول هو مجرد إعلان.المترجم يعرف أنه في مكان ما في البرنامج أن المهمة لن تكون تعريف مع هذا النموذج.الآن إذا كان المترجم يحصل استدعاء دالة شيء مثل هذا

int b=fun(x,y,z);

المترجم رمي خطأ تقول أنه لا يوجد مثل هذه الوظيفة.لأنه لا يملك أي نموذج لتلك الوظيفة.

لاحظ الفرق بين البرنامجين.

برنامج 1

#include <stdio.h>
void print(int a)
{
     printf("%d",a);
}
main()
{
    print(5);
}

في هذه وظيفة الطباعة معلنة ومحددة أيضا.منذ استدعاء دالة قادم بعد التعريف.تشاهد الآن البرنامج القادم.

برنامج 2

 #include <stdio.h>
 void print(int a); // In this case this is essential
 main()
 {
    print(5);
 }
 void print(int a)
 {
     printf("%d",a);
 }

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

التعريف :

هذا الجزء من تحديد وظيفة يسمى التعريف.تقول ماذا تفعل داخل الدالة.

void print(int a)
{
    printf("%d",a);
}

الآن مع المتغيرات.

int a; //declaration
a=10; //definition 

في بعض الأحيان الإعلان و التعريف يتم تجميعها في بيان واحد مثل هذا.

int a=10;

لفهم الأسماء، دعونا نركز على الأفعال أولا.

على أعلن - يمكنك للإعلان رسميا. إعلان

على تحديد - يمكنك لعرض أو وصف (شخص ما أو شيء) بوضوح وبشكل كامل

وهكذا، عندما تقوم بتعريف شيء، كنت اقول فقط <م> ما هو عليه .

// declaration
int sum(int, int);

وهذا الخط <م> يعلن وC وظيفة تسمى sum أن يأخذ حجتين من نوع int وإرجاع int. ومع ذلك، لا يمكن استخدامه حتى الان.

وعندما تقدم <م> كيف يعمل في الواقع ، وهذا هو تعريف منه.

// definition
int sum(int x, int y)
{
    return x + y;
}

لفهم الفرق بين الإعلان وتعريف نحن بحاجة لرؤية رمز التجميع:

uint8_t   ui8 = 5;  |   movb    $0x5,-0x45(%rbp)
int         i = 5;  |   movl    $0x5,-0x3c(%rbp)
uint32_t ui32 = 5;  |   movl    $0x5,-0x38(%rbp)
uint64_t ui64 = 5;  |   movq    $0x5,-0x10(%rbp)
double   doub = 5;  |   movsd   0x328(%rip),%xmm0        # 0x400a20
                        movsd   %xmm0,-0x8(%rbp)

وهذا هو الوحيد تعريف:

ui8 = 5;   |   movb    $0x5,-0x45(%rbp)
i = 5;     |   movl    $0x5,-0x3c(%rbp)
ui32 = 5;  |   movl    $0x5,-0x38(%rbp)
ui64 = 5;  |   movq    $0x5,-0x10(%rbp)
doub = 5;  |   movsd   0x328(%rip),%xmm0        # 0x400a20
               movsd   %xmm0,-0x8(%rbp)

وكما ترون تغيير أي شيء.

والإعلان يختلف عن تعريف لأنه يعطي المعلومات تستخدم فقط من قبل المترجم. على سبيل المثال uint8_t نقول للمترجم لاستخدام وظيفة ASM movb.

وانظر ما يلي:

uint def;                  |  no instructions
printf("some stuff...");   |  [...] callq   0x400450 <printf@plt>
def=5;                     |  movb    $0x5,-0x45(%rbp)

وإعلان لها لا تعليمات يعادل لأنه لا شيء ليتم تنفيذها.

وعلاوة على ذلك إعلان يحكي مترجم نطاق المتغير.

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

واستطاع لم تصرح بأشد العبارات الممكنة العامة، أن الإعلان هو معرف التي يتم تخصيص أية التخزين وتعريف يخصص الواقع التخزين من معرف أعلن؟

وفكر واحد للاهتمام - قالب لا يمكن تخصيص التخزين حتى يتم ربط الدرجة أو الوظيفة مع نوع المعلومات. لذلك القالب المعرف إعلانا أو التعريف؟ وينبغي أن يكون إعلانا منذ يتم تخصيص أي التخزين، وأنت ببساطة 'النماذج' فئة القالب أو وظيفة.

العثور على إجابات مماثلة هنا: التقنية أسئلة المقابلة في ج.

A إعلان يوفر اسم البرنامج ؛ a تعريف يوفر فريدة من نوعها وصف كيان ما (مثلا ، النوع سبيل المثال, وظيفة) داخل البرنامج.الإعلانات يمكن أن تتكرر في أي نطاق ، فإنه يدخل الاسم في أي نطاق.

الإعلان هو التعريف إلا إذا:

  • إعلان تعلن وظيفة دون تحديد جسمها ،
  • الإعلان يحتوي على extern محدد و لا مهيئ أو وظيفة الجسم ،
  • الإعلان هو إعلان من فئة ثابتة بيانات الأعضاء دون تعريف الفئة ،
  • الإعلان هو اسم الفئة التعريف ،

تعريف الإعلان إلا إذا:

  • تعريف يحدد فئة ثابتة بيانات الأعضاء ،
  • تعريف يعرف غير مضمنة الأعضاء وظيفة.

وهذا هو الذهاب الى صوت جبني حقا، لكنه هو أفضل وسيلة لقد كنت قادرة على الحفاظ على شروط مباشرة في رأسي:

والإعلان: صورتي توماس جيفرسون يخطب ... "أصرح بأن هذا FOO موجود في هذا المصدر CODE!"

والتعريف: الصورة القاموس، كنت تبحث عن فو وماذا يعني في الواقع

.

ويعرض إعلان اسم الرمز إلى مترجم. تعريف هو إعلان أن يخصص مساحة للرمز.

int f(int x); // function declaration (I know f exists)

int f(int x) { return 2*x; } // declaration and definition

ووفقا لدليل مكتبة GNU C ( HTTP: / /www.gnu.org/software/libc/manual/html_node/Header-Files.html )

<اقتباس فقرة>   

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

وإعلان يعني إعطاء اسم ونوع متغير (في حالة تعريف متغير)، على سبيل المثال:

int i;

وأو إعطاء اسم ونوع العودة والمعلمة (ق) اكتب إلى وظيفة من دون الجسم (في حالة إعلان وظيفة)، على سبيل المثال:

int max(int, int);

وبينما تعريف يعني قيمة تعيين إلى متغير (في حالة تعريف متغير)، على سبيل المثال:

i = 20;

وأو تقدم / إضافة الجسم (وظائف) إلى وظيفة ما يسمى تعريف الدالة، على سبيل المثال:

int max(int a, int b)
{
   if(a>b)   return a;
   return b;  
}

والعديد من إعلان وقت وتعريف يمكن القيام به معا على النحو التالي:

int i=20;

وو:

int max(int a, int b)
{
    if(a>b)   return a;
    return b;    
} 

في الحالات المذكورة أعلاه نحدد وتعلن i متغير وfunction max().

ومفهوم الإعلان وتعريف ستشكل مأزق عندما كنت تستخدم فئة تخزين خارجي لتعريف الخاص بك وسوف يكون في موقع آخر وكنت إعلان متغير في ملف التعليمات البرمجية المحلي (الصفحة). فارق واحد بين C و C ++ هو أنه في C التي تتم الإعلانات عادة في بداية الصفحة وظيفة أو رمز. في C ++ انها ليست مثل ذلك. يمكنك أن تعلن في مكان من اختيارك.

بلدي المفضل على سبيل المثال هو "int Num = 5" هنا المتغير الخاص بك هو 1.تعريف الباحث 2.أعلن الأسطوانات و 3.إنشاء مثيل بقيمة خمسة.نحن

  • تحديد نوع كائن ، التي قد تكون مدمجة أو فئة أو البنية.
  • تعلن اسم كائن أي شيء مع اسم أعلنت والذي يتضمن متغيرات Funtions ، إلخ.

فئة أو البنية يسمح لك لتغيير كيفية الكائنات سوف تكون محددة عندما يتم استخدامها لاحقا.على سبيل المثال

  • واحد يعلن متجانسة متغير أو مجموعة التي لا يعرف على وجه التحديد.
  • باستخدام إزاحة في C++ يمكنك تحديد كائن الذي لم يعلن اسمه.

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

مراحل قابل للتنفيذ الجيل:

(1) قبل المعالج -> (2) مترجم/مترجم -> (3) رابط

في المرحلة 2 (المترجم/المترجم), إعلان البيانات في التعليمات البرمجية لدينا تقول أن المترجم أن هذه الأشياء التي سوف تستخدم في المستقبل يمكنك أن تجد التعريف في وقت لاحق ، بمعنى :

مترجم تأكد من أن : ما هو ماذا ؟ يعني الإعلان

(3) مرحلة (رابط) يحتاج تعريف لربط الأشياء

رابط التأكد من أن : حيث ما هو ؟ يعني تعريف

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