Hãy nói rằng chúng ta sẽ bỏ qua những điều rõ ràng như bảo vệ tiêu đề.
Đôi khi, bạn muốn tạo mã cần được sao chép / dán bởi trình biên dịch trước:
#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)
cho phép bạn viết mã này:
RAISE_ERROR_STL("Hello... The following values " << i << " and " << j << " are wrong") ;
Và có thể tạo tin nhắn như:
Error Raised:
====================================
File : MyFile.cpp, line 225
Function : MyFunction(int, double)
Message : "Hello... The following values 23 and 12 are wrong"
Lưu ý rằng việc trộn các mẫu với macro có thể dẫn đến kết quả thậm chí tốt hơn (nghĩa là tự động tạo các giá trị song song với tên biến của chúng)
Những lần khác, bạn cần __FILE__ và / hoặc __LINE__ của một số mã, để tạo thông tin gỡ lỗi, ví dụ. Sau đây là một tác phẩm kinh điển cho Visual C ++:
#define WRNG_PRIVATE_STR2(z) #z
#define WRNG_PRIVATE_STR1(x) WRNG_PRIVATE_STR2(x)
#define WRNG __FILE__ "("WRNG_PRIVATE_STR1(__LINE__)") : ------------ : "
Như với đoạn mã sau:
#pragma message(WRNG "Hello World")
nó tạo ra các thông điệp như:
C:\my_project\my_cpp_file.cpp (225) : ------------ Hello World
Những lần khác, bạn cần tạo mã bằng cách sử dụng các toán tử ghép nối # và ##, như tạo getters và setters cho một thuộc tính (điều này dành cho các trường hợp khá hạn chế, thông qua).
Những lần khác, bạn sẽ tạo mã hơn là không biên dịch nếu được sử dụng thông qua một hàm, như:
#define MY_TRY try{
#define MY_CATCH } catch(...) {
#define MY_END_TRY }
Mà có thể được sử dụng như
MY_TRY
doSomethingDangerous() ;
MY_CATCH
tryToRecoverEvenWithoutMeaningfullInfo() ;
damnThoseMacros() ;
MY_END_TRY
(tuy nhiên, tôi chỉ thấy loại mã này được sử dụng đúng một lần )
Cuối cùng, nhưng không kém phần quan trọng, nổi tiếng 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;
}
(Lưu ý: sao chép mã / dán từ trang chủ boost)
Đó là cách (IMHO) tốt hơn std::for_each
.
Vì vậy, macro luôn hữu ích vì chúng nằm ngoài các quy tắc biên dịch thông thường. Nhưng tôi thấy rằng hầu hết thời gian tôi nhìn thấy một, chúng vẫn là mã C không bao giờ được dịch thành C ++ thích hợp.