헤더 가드와 같은 명백한 것을 무시한다고 가정 해 봅시다.
때로는 프리 컴파일러가 복사 / 붙여 넣기해야하는 코드를 생성하려고합니다.
#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
다른 경우에는 속성에 대한 게터 및 세터 생성과 같이 # 및 ## 연결 연산자를 사용하여 코드를 생성해야합니다 (이 경우는 매우 제한적입니다).
다른 경우에는 다음과 같은 함수를 통해 사용하면 컴파일되지 않는 코드가 생성됩니다.
#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;
}
(참고 : 부스트 홈페이지에서 코드 복사 / 붙여 넣기)
어느 것이 (IMHO)보다 낫습니다 std::for_each
.
따라서 매크로는 일반적인 컴파일러 규칙 외부에 있기 때문에 항상 유용합니다. 그러나 나는 하나를 볼 때 대부분 C 코드가 실제로 유효한 C ++로 변환되지 않은 채 남아 있다는 것을 알았습니다.