สมมติว่าเราจะเพิกเฉยต่อสิ่งที่ชัดเจนเช่นการ์ดส่วนหัว
บางครั้งคุณต้องการสร้างรหัสที่ต้องคัดลอก / วางโดย precompiler:
#define RAISE_ERROR_STL(p_strMessage) \
do \
{ \
try \
{ \
std::tstringstream strBuffer ; \
strBuffer << p_strMessage ; \
strMessage = strBuffer.str() ; \
raiseSomeAlert(__FILE__, __FUNCSIG__, __LINE__, strBuffer.str().c_str()) \
} \
catch(...){} \
{ \
} \
} \
while(false)
ซึ่งช่วยให้คุณสามารถรหัสนี้:
RAISE_ERROR_STL("Hello... The following values " << i << " and " << j << " are wrong") ;
และสามารถสร้างข้อความเช่น:
Error Raised:
====================================
File : MyFile.cpp, line 225
Function : MyFunction(int, double)
Message : "Hello... The following values 23 and 12 are wrong"
โปรดทราบว่าเทมเพลตการผสมกับมาโครสามารถนำไปสู่ผลลัพธ์ที่ดียิ่งขึ้น (เช่นการสร้างค่าแบบเคียงข้างกันพร้อมชื่อตัวแปร)
ในบางครั้งคุณต้องใช้ __FILE__ และ / หรือ __LINE__ ของรหัสบางอย่างเพื่อสร้างข้อมูลการดีบักตัวอย่างเช่น ต่อไปนี้เป็นคลาสสิกสำหรับ Visual C ++:
#define WRNG_PRIVATE_STR2(z) #z
#define WRNG_PRIVATE_STR1(x) WRNG_PRIVATE_STR2(x)
#define WRNG __FILE__ "("WRNG_PRIVATE_STR1(__LINE__)") : ------------ : "
เช่นเดียวกับรหัสต่อไปนี้:
#pragma message(WRNG "Hello World")
มันสร้างข้อความเช่น:
C:\my_project\my_cpp_file.cpp (225) : ------------ Hello World
ในบางครั้งคุณต้องสร้างรหัสโดยใช้ตัวดำเนินการต่อข้อมูล # และ ## เช่นสร้าง getters และ setters สำหรับคุณสมบัติ (นี่เป็นกรณีที่ค่อนข้าง จำกัด ผ่าน)
ในบางครั้งคุณจะสร้างโค้ดมากกว่าจะไม่คอมไพล์หากใช้ผ่านฟังก์ชันเช่น:
#define MY_TRY try{
#define MY_CATCH } catch(...) {
#define MY_END_TRY }
ซึ่งสามารถใช้เป็น
MY_TRY
doSomethingDangerous() ;
MY_CATCH
tryToRecoverEvenWithoutMeaningfullInfo() ;
damnThoseMacros() ;
MY_END_TRY
(ยังฉันเห็นรหัสชนิดนี้ถูกใช้ครั้งเดียวเท่านั้น )
สุดท้าย แต่ไม่ท้ายสุดboost::foreach
!!!
#include <string>
#include <iostream>
#include <boost/foreach.hpp>
int main()
{
std::string hello( "Hello, world!" );
BOOST_FOREACH( char ch, hello )
{
std::cout << ch;
}
return 0;
}
(หมายเหตุ: การคัดลอกโค้ด / วางจากหน้าแรกของ Boost)
ซึ่งเป็น (IMHO) std::for_each
วิธีที่ดีกว่า
ดังนั้นแมโครจึงมีประโยชน์เสมอเพราะอยู่นอกกฎคอมไพเลอร์ปกติ แต่ฉันพบว่าเวลาส่วนใหญ่ที่ฉันเห็นพวกเขายังคงอยู่ในรหัส C อย่างมีประสิทธิภาพไม่เคยแปลเป็นภาษา C ++ ที่เหมาะสม