Diyelim ki başlık muhafızları gibi belirgin şeyleri görmezden geleceğiz.
Bazen, ön derleyici tarafından kopyalanması / yapıştırılması gereken kodlar oluşturmak istersiniz:
#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)
bunu kodlamanızı sağlar:
RAISE_ERROR_STL("Hello... The following values " << i << " and " << j << " are wrong") ;
Ve aşağıdaki gibi mesajlar üretebilir:
Error Raised:
====================================
File : MyFile.cpp, line 225
Function : MyFunction(int, double)
Message : "Hello... The following values 23 and 12 are wrong"
Şablonları makrolarla karıştırmanın daha iyi sonuçlara yol açabileceğini unutmayın (örn. Değerleri değişken adlarıyla otomatik olarak yan yana oluşturma)
Diğer durumlarda, örneğin hata ayıklama bilgileri oluşturmak için bazı kodların __FILE__ ve / veya __LINE__ öğelerine ihtiyacınız vardır. Visual C ++ için bir klasik aşağıdadır:
#define WRNG_PRIVATE_STR2(z) #z
#define WRNG_PRIVATE_STR1(x) WRNG_PRIVATE_STR2(x)
#define WRNG __FILE__ "("WRNG_PRIVATE_STR1(__LINE__)") : ------------ : "
Aşağıdaki kodda olduğu gibi:
#pragma message(WRNG "Hello World")
aşağıdaki gibi mesajlar üretir:
C:\my_project\my_cpp_file.cpp (225) : ------------ Hello World
Diğer zamanlarda, bir özellik için alıcılar ve ayarlayıcılar oluşturma gibi # ve ## birleştirme işleçlerini kullanarak kod oluşturmanız gerekir (bu, oldukça sınırlı durumlar içindir).
Diğer zamanlarda, aşağıdaki gibi bir işlevle kullanılırsa derlenmeyecek bir kod üreteceksiniz:
#define MY_TRY try{
#define MY_CATCH } catch(...) {
#define MY_END_TRY }
Hangi olarak kullanılabilir
MY_TRY
doSomethingDangerous() ;
MY_CATCH
tryToRecoverEvenWithoutMeaningfullInfo() ;
damnThoseMacros() ;
MY_END_TRY
(yine de, bu tür kodların sadece bir kez doğru kullanıldığını gördüm )
Son, ama en az değil, ünlü 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;
}
(Not: kod kopyalama / destek ana sayfasından yapıştırıldı)
Hangisi (IMHO) daha iyi std::for_each
.
Bu nedenle, makrolar her zaman yararlıdır çünkü normal derleyici kurallarının dışındadırlar. Ama çoğu zaman bir tane gördüğümde, etkili bir şekilde uygun C ++'a çevrilmemiş C kodunun kalıntıları olduğunu görüyorum.