Diese Frage gibt ein klares Beispiel dafür, wie Sie Makros schlecht verwenden können. Um andere Beispiele zu sehen (und unterhalten zu werden), sehen Sie sich diese Frage an .
Nachdem ich das gesagt habe, werde ich Beispiele aus der Praxis geben, die meiner Meinung nach eine gute Integration von Makros darstellen.
Das erste Beispiel wird in CppUnit angezeigt , einem Unit-Test-Framework. Wie bei jedem anderen Standard-Testframework erstellen Sie eine Testklasse und müssen dann irgendwie angeben, welche Methoden im Rahmen des Tests ausgeführt werden sollen.
#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();
}
Wie Sie sehen, enthält die Klasse als erstes Element einen Makroblock. Wenn ich eine neue Methode hinzufüge testSubtraction
, ist es offensichtlich, was Sie tun müssen, um sie in den Testlauf aufzunehmen.
Diese Makroblöcke werden folgendermaßen erweitert:
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;
}
Was würdest DU am liebsten lesen und pflegen?
Ein weiteres Beispiel ist das Microsoft MFC-Framework, in dem Sie Nachrichten Funktionen zuordnen:
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( )
Also, was sind die Dinge, die "gute Makros" von der schrecklichen bösen Art unterscheiden?
Sie erfüllen eine Aufgabe, die auf keine andere Weise vereinfacht werden kann. Das Schreiben eines Makros zur Bestimmung eines Maximums zwischen zwei Elementen ist falsch, da Sie dasselbe mit einer Vorlagenmethode erreichen können. Es gibt jedoch einige komplexe Aufgaben (z. B. das Zuordnen von Nachrichtencodes zu Elementfunktionen), die in der C ++ - Sprache nicht elegant ausgeführt werden.
Sie haben eine extrem strenge, formale Verwendung. In beiden Beispielen werden die Makroblöcke durch Starten und Beenden von Makros angekündigt, und die dazwischen liegenden Makros werden immer nur in diesen Blöcken angezeigt. Sie haben normales C ++, entschuldigen sich kurz mit einem Makroblock und kehren dann wieder zum Normalzustand zurück. In den Beispielen für "böse Makros" sind die Makros über den gesamten Code verteilt, und der unglückliche Leser kann nicht wissen, wann die C ++ - Regeln gelten und wann nicht.