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