我在应用程序中看到了此代码,但是我不认识语法。我必须在C ++中进行等效,但是此代码在C中。
如何使它在C ++应用程序中运行?这种定义的名称是什么?定义列表中的每个常量都一样吗?
/*! Object types */
#define F_ENUM(x, y) x = y,
#define F_SWITCH(x, y) case x: return ( #x );
#define OB_LIST(f) \
f(T0, 0) \ //this declaration has no storage class or type specifier
//identifier "T0" is undefined
f(T1, 1) \ //expected a ")"
//unrecognized token
//expected a ";"
f(T2, 2) \
f(T3, 3) \
f(T4, 4) \
f(T5, 5)
enum mxt_object_type {
OB_LIST(F_ENUM)
};
此外,当我在C ++编译器中进行编译时,会出现类似这样的错误:
this declaration has no storage class or type specifier
identifier "T0" is undefined
expected a ")"
unrecognized token
expected a ";"
它们被标记在代码上。这些错误是什么意思?
[如果您想查看处理后的结果是什么,只需问一下即可,使用gcc / g ++,选项为-E
,如果我对您的代码执行的结果是:] >
pi@raspberrypi:/tmp $ gcc -E d.c # 1 "d.c" # 1 "<built-in>" # 1 "<command-line>" # 31 "<command-line>" # 1 "/usr/include/stdc-predef.h" 1 3 4 # 32 "<command-line>" 2 # 1 "d.c" # 13 "d.c" enum mxt_object_type { T0 = 0, T1 = 1, T2 = 2, T3 = 3, T4 = 4, T5 = 5, };
当然这里不使用
F_SWITCH
我必须在C ++中做到等效,但是此代码在C中
您无所事事,在C ++中也是如此
这些宏用于预处理器,而不是单独用于C或C ++,它们看到了我开头显示的结果
C ++编译示例:
pi@raspberrypi:/tmp $ cat d.cc /*! Object types */ #define F_ENUM(x, y) x = y, #define F_SWITCH(x, y) case x: return ( #x ); #define OB_LIST(f) \ f(T0, 0) \ f(T1, 1) \ f(T2, 2) \ f(T3, 3) \ f(T4, 4) \ f(T5, 5) enum mxt_object_type { OB_LIST(F_ENUM) }; pi@raspberrypi:/tmp $ g++ -c -pedantic -Wall d.cc pi@raspberrypi:/tmp $
如何运作:
OB_LIST(F_ENUM)
的形式扩展OB_LIST
以产生F_ENUM(T0, 0) F_ENUM(T1, 1) F_ENUM(T2, 2) F_ENUM(T3, 3) F_ENUM(T4, 4) F_ENUM(T5, 5)
F_ENUM
以产生最终结果T0 = 0, T1 = 1, T2 = 2, T3 = 3, T4 = 4, T5 = 5,
F_SWITCH
的经典用法:
const char * nameIt(mxt_object_type v) { switch (v) { OB_LIST(F_SWITCH) default: return "unknown"; } }
产生:
替换为文字字符串,并替换为其值const char * nameIt(mxt_object_type v) { switch (v) { case T0: return ( "T0" ); case T1: return ( "T1" ); case T2: return ( "T2" ); case T3: return ( "T3" ); case T4: return ( "T4" ); case T5: return ( "T5" ); default: return "unknown"; } }
"T0"
之类的字符串是由#x
产生的,他们将x
这就是所谓的“ X宏”,它是关于制作任何类型的常量的列表,并将该列表的维护集中到源代码中的单个位置,以避免代码重复。以可读性为代价。
enum mxt_object_type {
T0 = 0,
T1 = 1,
T2 = 2,
T3 = 3,
T4 = 4,
T5 = 5,
};
嗯,如果您将该代码预处理为文件,则会得到:
它使用宏定义来定义另一个枚举类型。 F_ENUM是一个宏,用于定义枚举中的每个项目。 F_SWICH是将在switch语句中使用的宏。此技术用于避免重复代码
如果您添加这样的代码