最近,我正在一个项目中工作,该项目有很多使用宏生成的代码。我遇到过生成代码非常少的情况。但是在当前版本中,有很多代码是使用#defines等生成的。 例如,类似于事件生成和处理的类,并为类生成类ID。
#define INIT_EVENT_INFO(eventType) \
template <> const GenericClassID eventType::tClassID(#eventType) ;
#define DECLARE_EVENT(dType, evtType, destnType) \
typedef DUMMY_EVT_GEN<dType, std_event, custom_destn, destnType>::EventClass evtType;
template <typename ctData,
EventTypes evType,
DestnTypes evtDestType = standard_destn,
class DestnInterface = EmptyClass>
class DUMMY_EVT_GEN
{
private:
// alias for our current generator
typedef DUMMY_EVT_GEN<ctData,
evType,
evtDestType,
DestnInterface> Generator;
// Construct the first layer by adding the data part to our
// framework event base class.
//
typedef BaseEvent::DerivedEvent<Generator> CompleteEvent_;
/*
* Assemble an event destn type
*/
// Determine base class for event Destn: RTTIEventDestn for
// rtiDestns
typedef typename IF<isRtiDestn, BRTTIEventDestn, EventDestn>::type DestnBase_;
// create event Destn type
typedef typename IF<isCustomDestn, DestnInterface, BaseEvent::THBDestn<Generator> >::type DestnType_;
public:
/**
* A struct that contains all configuration options
*/
struct Config
{
/// base class for the Destn (rti or not)
typedef DestnBase_ DestnBaseClass;
/// class serving as data container for the event type
typedef ctData EventDataClass;
/// the resulting event type
typedef CompleteEvent_ EventClass;
/// the resulting Destn interface type
typedef DestnType_ DestnInterface;
};
// our final return values
typedef typename Config::EventClass EVT;
typedef typename Config::DestnInterface DestnInterface;
typedef typename Config::EventClass EventClass;
};
现在,我的问题是,是否有一种特定的方式已经定义了这些东西。
哈希定义可以用于自己的自由。 但是,是否有任何定义的模式或方法来编写这样的代码,这有助于我们生成这样的代码。不仅仅是这种情况。还有许多其他场景,可以编写这样的代码并用于自动生成类,事件,结构等。
作为一名程序员,如何考虑编写这样的宏&#39;这将减轻我们的努力。它确实来自实践,但有任何具体的方式或模式 或者任何帮助我们以这种方式编程的文档,我的意思是考虑使用这样的宏进行编程。
任何指示或建议都会有很大的帮助。
答案 0 :(得分:0)
这只是我的想法,不适合简单的回复:-)。
C ++,特别是c11及更高版本添加了许多功能,用一个可控制的基于编译器的生成器替换宏,从模板开始,以constexpr结尾。这是一个比宏更强大的机制,尽管它通常需要更多的文本来表达意图。无论如何,由于这个原因,与c
相比,marcros的需求显着减少。我实际上看到了使用c ++
#define PACKED __attribute((packed))__
#ifndef MY_HDR .. #define MY_HDR ... #endif
#define tostr(A) case A: return #A;