이 질문은 매크로를 잘못 사용하는 방법에 대한 명확한 예를 제공합니다. 다른 예를보고 즐기려면 이 질문을 참조하십시오 .
내가 말했듯이, 나는 매크로의 좋은 통합으로 간주되는 것에 대한 실제 예를 제시 할 것이다.
첫 번째 예 는 단위 테스트 프레임 워크 인 CppUnit에 나타납니다 . 다른 표준 테스트 프레임 워크와 마찬가지로 테스트 클래스를 만든 다음 테스트의 일부로 실행할 메소드를 어떻게 든 지정해야합니다.
#include <cppunit/extensions/HelperMacros.h>
class ComplexNumberTest : public CppUnit::TestFixture
{
CPPUNIT_TEST_SUITE( ComplexNumberTest );
CPPUNIT_TEST( testEquality );
CPPUNIT_TEST( testAddition );
CPPUNIT_TEST_SUITE_END();
private:
Complex *m_10_1, *m_1_1, *m_11_2;
public:
void setUp();
void tearDown();
void testEquality();
void testAddition();
}
보시다시피, 클래스에는 첫 번째 요소 인 매크로 블록이 있습니다. 새로운 방법을 추가했다면 testSubtraction
테스트 실행에 포함시키기 위해해야 할 일이 분명합니다.
이 매크로 블록은 다음과 같이 확장됩니다.
public:
static CppUnit::Test *suite()
{
CppUnit::TestSuite *suiteOfTests = new CppUnit::TestSuite( "ComplexNumberTest" );
suiteOfTests->addTest( new CppUnit::TestCaller<ComplexNumberTest>(
"testEquality",
&ComplexNumberTest::testEquality ) );
suiteOfTests->addTest( new CppUnit::TestCaller<ComplexNumberTest>(
"testAddition",
&ComplexNumberTest::testAddition ) );
return suiteOfTests;
}
어느 쪽을 읽고 유지하기를 원하십니까?
또 다른 예는 함수를 메시지에 맵핑하는 Microsoft MFC 프레임 워크입니다.
BEGIN_MESSAGE_MAP( CMyWnd, CMyParentWndClass )
ON_MESSAGE( WM_MYMESSAGE, OnMyMessage )
ON_COMMAND_RANGE(ID_FILE_MENUITEM1, ID_FILE_MENUITEM3, OnFileMenuItems)
// ... Possibly more entries to handle additional messages
END_MESSAGE_MAP( )
그렇다면 "좋은 매크로"와 끔찍한 악의 종류를 구별하는 것은 무엇입니까?
다른 방법으로는 단순화 할 수없는 작업을 수행합니다. 두 가지 요소 사이의 최대 값을 결정하기 위해 매크로를 작성하는 것은 잘못된 것입니다. 템플릿 방법을 사용하여 동일한 것을 달성 할 수 있기 때문입니다. 그러나 C ++ 언어가 우아하게 처리하지 못하는 복잡한 작업 (예 : 메시지 코드를 멤버 함수에 매핑)이 있습니다.
그들은 매우 엄격하고 공식적인 사용법을 가지고 있습니다. 이 두 가지 예에서, 매크로 블록은 매크로를 시작하고 종료함으로써 공지되며, 그 사이의 매크로는 이들 블록 내에 만 나타날 것이다. 당신은 정상적인 C ++을 가지고 있으며, 매크로 블록으로 간단히 변명 한 다음 다시 정상으로 돌아갑니다. "사악한 매크로"예제에서 매크로는 코드 전체에 흩어져 있으며, 아무리 우 독한 독자도 C ++ 규칙이 적용되는 시점과 적용 시점을 알 수있는 방법이 없습니다.