Bu soru, makroları nasıl kötü kullanabileceğinize dair açık bir örnek vermektedir. Diğer örnekleri görmek (ve eğlenmek) için bu soruya bakın .
Bunu söyledikten sonra, makroların iyi bir şekilde dahil edildiğini düşündüğüm gerçek dünyaya örnekler vereceğim.
İlk örnek , birim test çerçevesi olan CppUnit'te görünür . Diğer herhangi bir standart test çerçevesi gibi, bir test sınıfı oluşturursunuz ve testin bir parçası olarak hangi yöntemlerin çalıştırılacağını bir şekilde belirtmeniz gerekir.
#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();
}
Gördüğünüz gibi, sınıfın ilk öğesi olarak bir makro bloğu vardır. Yeni bir yöntem eklediysem testSubtraction
, test çalışmasına dahil etmek için ne yapmanız gerektiği açıktır.
Bu makro bloklar şöyle bir şeye genişler:
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;
}
Hangisini okumayı ve sürdürmeyi tercih edersiniz?
Başka bir örnek, işlevleri iletilerle eşleştirdiğiniz Microsoft MFC çerçevesinde yer almaktadır:
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( )
Peki, "İyi Makrolar" ı korkunç kötü türden ayıran şeyler nelerdir?
Başka bir şekilde basitleştirilemeyen bir görevi yerine getirirler. İki öğe arasında bir maksimum belirlemek için bir makro yazmak yanlıştır, çünkü bunu bir şablon yöntemi kullanarak elde edebilirsiniz. Ancak, C ++ dilinin zarifçe işlemediği bazı karmaşık görevler (örneğin, mesaj kodlarını üye işlevleriyle eşleme) vardır.
Son derece katı ve resmi bir kullanımları vardır. Bu örneklerin her ikisinde de makro bloklar makroları başlatarak ve bitirerek bildirilir ve aradaki makrolar sadece bu blokların içinde görünür. Normal C ++ 'nız var, kısaca bir makro bloğu ile özür dileriz ve sonra tekrar normale dönersiniz. "Kötü makrolar" örneklerinde, makrolar kod boyunca dağılmıştır ve bahtsız okuyucunun C ++ kurallarının ne zaman uygulandığını ve uygulanmadığını bilmesinin bir yolu yoktur.