Latest web development tutorials

C ++ المعالج

بعض التوجيهات المعالج، يوجه المعالج للمترجم قبل تجميع الفعلية تحتاج لإكمال.

جميع التوجيهات المعالج هي (#) بدءا من الجنيه، قد لا تظهر إلا حرف مسافة قبل موجهات المعالج. C ++ التوجيه المعالج هو ليس بيانا، بحيث لا تكون فاصلة منقوطة، وفي النهاية ().

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

كما تدعم C ++ عددا من التوجيهات تجهيزها، مثل # تشمل # تعريف، # إذا # آخر # الخط، وما إلى ذلك، دعونا نلقي نظرة على هذه التعليمات الهامة.

تجهيزها تعريف #

# تعريف التوجيه المعالج تستخدم لخلق رمزي الثوابت. عادة ما يسمى ثابت رمزيماكرو، وشكل من أشكال القيادة العامة هي:

#define macro-name replacement-text 

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

#include <iostream>
using namespace std;

#define PI 3.14159

int main ()
{
 
    cout << "Value of PI :" << PI << endl; 

    return 0;
}

الآن، دعونا اختبار هذا الرمز، نلقي نظرة على نتائج المعالجة. لنفترض أن الملف المصدر موجود بالفعل، ثم استخدام الخيار -E لتجميع وإعادة توجيه النتائج إلى test.p. الآن، إذا نظرتم test.p الملف، سترى أنه يحتوي بالفعل على الكثير من المعلومات، وتم تغيير قيمة في الجزء السفلي من الملف كما يلي:

$gcc -E test.cpp > test.p

...
int main ()
{
 
    cout << "Value of PI :" << 3.14159 << endl; 

    return 0;
}

وظائف الكلى

يمكنك استخدام # تعريف لتعريف الماكرو كما يلي مع المعلمة:

#include <iostream>
using namespace std;

#define MIN(a,b) (((a)<(b)) ? a : b)

int main ()
{
   int i, j;
   i = 100;
   j = 30;
   cout <<"The minimum is " << MIN(i, j) << endl;

    return 0;
}

عندما يتم ترجمة التعليمات البرمجية أعلاه وتنفيذها، وتنتج النتائج التالية:

The minimum is 30

الترجمة الشرطية

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

هيكلة واختيار إذا كانت الظروف الهيكلية مثل الكثير من قبل المعالج. النظر في قانون المرور المعالج التالية:

#ifndef NULL
   #define NULL 0
#endif

يمكنك ان تجعل فقط عند التحويل البرمجي مع التصحيح، والتصحيح يمكن أن تتحقق باستخدام ماكرو، على النحو التالي:

#ifdef DEBUG
   cerr <<"Variable x = " << x << endl;
#endif

إذا قبل تم تعريف التصحيح التعليمات #IFDEF التصحيح المستمر رمزية، وسوف يكون على البياناتcerr برنامج المترجمة.يمكنك استخدام #if 0 تعليق من جانب بيان من البرنامج، على النحو التالي:

#if 0
   不进行编译的代码
#endif

دعونا نحاول الأمثلة التالية:

#include <iostream>
using namespace std;
#define DEBUG

#define MIN(a,b) (((a)<(b)) ? a : b)

int main ()
{
   int i, j;
   i = 100;
   j = 30;
#ifdef DEBUG
   cerr <<"Trace: Inside main function" << endl;
#endif

#if 0
   /* 这是注释部分 */
   cout << MKSTR(HELLO C++) << endl;
#endif

   cout <<"The minimum is " << MIN(i, j) << endl;

#ifdef DEBUG
   cerr <<"Trace: Coming out of main function" << endl;
#endif
    return 0;
}

عندما يتم ترجمة التعليمات البرمجية أعلاه وتنفيذها، وتنتج النتائج التالية:

Trace: Inside main function
The minimum is 30
Trace: Coming out of main function

# و## مشغلي

# ## ومشغل تجهيزها في C ++ و ANSI / ISO C في كان متوفرا. # المشغل سيتم تحويل رمزية استبدال النص إلى سلسلة بين علامتي اقتباس.

النظر في تعريف الماكرو التالي:

#include <iostream>
using namespace std;

#define MKSTR( x ) #x

int main ()
{
    cout << MKSTR(HELLO C++) << endl;

    return 0;
}

عندما يتم ترجمة التعليمات البرمجية أعلاه وتنفيذها، وتنتج النتائج التالية:

HELLO C++

دعونا نرى كيف يعمل. ومن المفهوم، C ++ قبل المعالج السطر التالي:

cout << MKSTR(HELLO C++) << endl;

تحويلها إلى:

cout << "HELLO C++" << endl;

## تستخدم المشغلين لربط اثنين من الرموز. هنا مثال على ذلك:

#define CONCAT( x, y )  x ## y

عندما يظهر CONCAT في البرنامج، وسيتم ربط معالمها، وتستخدم لتحل محل الماكرو. على سبيل المثال، يتم استبدال CONCAT برنامج (مرحبا، C ++) من قبل "مرحبا C ++"، كما هو موضح في الأمثلة التالية.

#include <iostream>
using namespace std;

#define concat(a, b) a ## b
int main()
{
   int xy = 100;
   
   cout << concat(x, y);
   return 0;
}

عندما يتم ترجمة التعليمات البرمجية أعلاه وتنفيذها، وتنتج النتائج التالية:

100

دعونا نرى كيف يعمل. ومن المفهوم، C ++ قبل المعالج السطر التالي:

cout << concat(x, y);

تحويلها إلى:

cout << xy;

C ++ وحدات الماكرو مسبقا

يتم توفير C ++ في الجدول أدناه بعض وحدات الماكرو مسبقا:

描述
__LINE__ 这会在程序编译时包含当前行号。
__FILE__ 这会在程序编译时包含当前文件名。
__DATE__ 这会包含一个形式为 month/day/year 的字符串,它表示把源文件转换为目标代码的日期。
__TIME__ 这会包含一个形式为 hour:minute:second 的字符串,它表示程序被编译的时间。

دعونا نلقي نظرة على هذه الأمثلة وحدات الماكرو:

#include <iostream>
using namespace std;

int main ()
{
    cout << "Value of __LINE__ : " << __LINE__ << endl;
    cout << "Value of __FILE__ : " << __FILE__ << endl;
    cout << "Value of __DATE__ : " << __DATE__ << endl;
    cout << "Value of __TIME__ : " << __TIME__ << endl;

    return 0;
}

عندما يتم ترجمة التعليمات البرمجية أعلاه وتنفيذها، وتنتج النتائج التالية:

Value of __LINE__ : 6
Value of __FILE__ : test.cpp
Value of __DATE__ : Feb 28 2011
Value of __TIME__ : 18:52:48