我讨厌这里的代码重复。如何使它更简洁?重复文本的另一个宏是一个好主意吗? 我有一种奇怪的感觉,我错过了一些明显的东西。
#define CHECK(para_1, para_2, para_3, epic_fail) { \
if (para_2 != para_3) { \
size_t __bytes; \
if(#para_1 == "special") { \
__bytes = snprintf( \
NULL, 0, \
#para_1 \
" this_thing '%s'(%p) doesn't go well with special this_thing '%s'(%p)", \
para_2, para_2, para_3, para_3); \
} else { \
__bytes = snprintf( \
NULL, 0, \
#para_1 " this_thing '%s'(%p) doesn't go well with unique_goldfish this_thing '%s'(%p)", \
para_2, para_2, para_3, para_3); \
} \
char * message = \
reinterpret_cast<char *>(rmw_allocate(__bytes + 1)); \
if(#para_1 == "special") { \
snprintf( \
message, __bytes + 1, \
#para_1 \
" this_thing '%s'(%p) doesn't go well with special this_thing '%s'(%p)", \
para_2, para_2, para_3, para_3); \
} else{ \
snprintf( \
message, __bytes + 1, \
#para_1 " this_thing '%s'(%p) doesn't go well with unique_goldfish this_thing '%s'(%p)", \
para_2, para_2, para_3, para_3); \
} \
SET_THE_ERROR(message); \
free_the_mem(message); \
epic_fail; \
} \
}
答案 0 :(得分:1)
在宏中使用宏:
#define CHECK_PRINT(n) snprintf( \
message, __bytes + n, \
#para_1 " this_thing '%s'(%p) doesn't go well with unique_goldfish this_thing '%s'(%p)", \
para_2, para_2, para_3, para_3);
#define CHECK(para_1, para_2, para_3, epic_fail) { \
if (para_2 != para_3) { \
size_t __bytes; \
if(#para_1 == "special") { \
__bytes = CHECK_PRINT(n); \
} else { \
__bytes = CHECK_PRINT(n); \
} \
...
答案 1 :(得分:0)
您可以添加一个功能来检查para条件。 希望这能解释你的问题
答案 2 :(得分:0)
如果您正在进行重大重构,可能需要考虑以下内容:
static
void check_impl( char const* p1, char const* p2, char const* p3)
{
char const* special_or_unique = (strcmp(p1,"special") == 0) ? "special" : "unique_goldfish";
char const* fmt = "%s this_thing '%s'(%p) doesn't go well with %s this_thing '%s'(%p)";
char* message = NULL;
size_t bytes = snprintf(NULL, 0, fmt,
p1,
p2, (void*) p2,
special_or_unique,
p3, (void*) p3);
message = (char*) malloc(bytes+1);
if (message) {
snprintf(message, bytes+ 1, fmt,
p1,
p2, (void*) p2,
special_or_unique,
p3, (void*) p3);
SET_THE_ERROR(message);
free(message);
}
else {
// some error handler?
}
}
#define CHECK(para_1, para_2, para_3, epic_fail) \
do { \
/*should this really be: if (strcmp((para_2), (para_3)) != 0) { */ \
if ((para_2) != (para_3)) { \
check_impl( #para_1, (para_2), (para_3)); \
epic_fail; \
} \
} while (0)