【发布时间】:2018-02-08 16:14:43
【问题描述】:
我做了一个宏。我担心它可能有点“太顽皮”,因为宏是邪恶的。
这是没有宏的代码:
case SDLK_a:
_buffer_.InsertAtCursor('a');
_buffer_.MutableCursor().Right();
break;
这里是宏定义及其用法:
#define SDLK_KEY_CASE_MACRO(X, Y) \
{\
case X: \
_buffer_.InsertAtCursor(Y); \
_buffer_.MutableCursor().Right(); \
break;\
}
SDLK_KEY_CASE_MACRO(SDLK_b, 'b');
SDLK_KEY_CASE_MACRO(SDLK_c, 'c');
SDLK_KEY_CASE_MACRO(SDLK_d, 'd');
SDLK_KEY_CASE_MACRO(SDLK_e, 'e');
SDLK_KEY_CASE_MACRO(SDLK_f, 'f');
SDLK_KEY_CASE_MACRO(SDLK_g, 'g');
SDLK_KEY_CASE_MACRO(SDLK_h, 'h');
SDLK_KEY_CASE_MACRO(SDLK_i, 'i');
SDLK_KEY_CASE_MACRO(SDLK_j, 'j');
SDLK_KEY_CASE_MACRO(SDLK_k, 'k');
SDLK_KEY_CASE_MACRO(SDLK_l, 'l');
SDLK_KEY_CASE_MACRO(SDLK_m, 'm');
SDLK_KEY_CASE_MACRO(SDLK_n, 'n');
SDLK_KEY_CASE_MACRO(SDLK_o, 'o');
SDLK_KEY_CASE_MACRO(SDLK_p, 'p');
SDLK_KEY_CASE_MACRO(SDLK_q, 'q');
SDLK_KEY_CASE_MACRO(SDLK_r, 'r');
SDLK_KEY_CASE_MACRO(SDLK_s, 's');
SDLK_KEY_CASE_MACRO(SDLK_t, 't');
SDLK_KEY_CASE_MACRO(SDLK_u, 'u');
SDLK_KEY_CASE_MACRO(SDLK_v, 'v');
SDLK_KEY_CASE_MACRO(SDLK_w, 'w');
SDLK_KEY_CASE_MACRO(SDLK_x, 'x');
SDLK_KEY_CASE_MACRO(SDLK_y, 'y');
SDLK_KEY_CASE_MACRO(SDLK_z, 'z');
显然,这为我节省了很多打字时间和很多代码行。代码也编译运行正常。
- 但是这个宏是不是太调皮了? (它是否可能会产生意想不到的行为,或者我有什么理由不应该在我的代码中使用这种“作弊”?)
【问题讨论】:
-
它们在 C++ 中比在 C 中更邪恶,所以你应该选择一个。
-
“很明显,这为我节省了大量的打字和代码行”——没错,但首先需要这些代码吗?
-
宏就像你用来在墙上钻螺丝的锤子一样邪恶......
-
你不能用
_buffer_.InsertAtCursor(value - SDLK_b + 'b'); _buffer_.MutableCursor().Right();替换整个switch吗?说到_buffer_.MutableCursor().Right();部分肯定不需要在switch中。 -
编写一个函数(或使用表格/地图)将
SDLK_...转换为...并删除开关。如果这不能做到,我更喜欢“真正的”开关,所有的行都超过宏