记录。
用于生成大量重复性代码,同时提高代码的可维护性和可读性。
不使用代码:
#include <iostream>
#include <string>
enum Fruit {
Apple,
Banana,
Cherry,
Grape,
Lemon
};
std::string FruitToString(Fruit fruit) {
switch (fruit) {
case Apple:
return "Apple";
case Banana:
return "Banana";
case Cherry:
return "Cherry";
case Grape:
return "Grape";
case Lemon:
return "Lemon";
default:
return "Unknown";
}
}
int main() {
Fruit fruit = Banana;
std::string fruitStr = FruitToString(fruit);
std::cout << "Fruit: " << fruitStr << std::endl;
return 0;
}
使用的代码:
#include <iostream>
#include <string>
// Define the X-Macro for fruits
#define FRUIT_LIST \
X(Apple) \
X(Banana) \
X(Cherry) \
X(Grape) \
X(Lemon)
enum Fruit {
#define X(fruit) fruit,
FRUIT_LIST
#undef X
};
std::string FruitNames[] = {
#define X(fruit) #fruit,
FRUIT_LIST
#undef X
};
std::string FruitToString(Fruit fruit) {
if (fruit >= Apple && fruit <= Lemon) {
return FruitNames[fruit];
}
return "Unknown";
}
int main() {
Fruit fruit = Banana;
std::string fruitStr = FruitToString(fruit);
std::cout << "Fruit: " << fruitStr << std::endl;
return 0;
}
X-Macro:
#include <iostream>
void Function_1() { std::cout << "Function_1 called\n"; }
void Function_2() { std::cout << "Function_1 called\n"; }
/* ... */
void Function_100() { std::cout << "Function_100 called\n"; }
#define MACROS_TABLE \
X_MACROS(Condition_1, Function_1) \
X_MACROS(Condition_2, Function_2) \
/* ... */ \
X_MACROS(Condition_100, Function_100) \
enum Condition {
#define X_MACROS(a, b) a,
MACROS_TABLE
#undef X_MACROS
CondSize//用于记录这个table有多大
};
const char* func_name_str[] = {
#define X_MACROS(a, b) #a,
MACROS_TABLE
#undef X_MACROS
};
typedef void (*func)();
const func func_table[] = {
#define X_MACROS(a, b) b,
MACROS_TABLE
#undef X_MACROS
};
static void SwitchHandle(Condition cond){
if(cond < Condition::CondSize)
{
func_table[cond]();
}
}
int main(){
SwitchHandle(Condition_1);
SwitchHandle(Condition_2);
/* ... */
SwitchHandle(Condition_100);
}