我有这段代码:
#ifdef something32 <----- might not be defined
the_real_value = thing[something32];
thing[something32] = my_value;
#else
the_real_value = thing[something]; <------- guarantied to be defined (something)
thing[something] = my_value;
#endif
#ifdef THE_OTHER_THING <--------- might not be defined
#ifdef something32
thing32[something32] = my_value;
#else
thing32[something] = my_value;
#endif
#endif
我会多次使用它,所以我想用宏替换它。我知道#ifdef不能生活在一个宏中,所以我想知道如何替换所有代码。有什么想法吗?
编辑:
对不起,我忘了提到something32
只是一长串变量中的一个。
想法是有类似
的东西SHORTEN_MY_CODE(something, something32);
SHORTEN_MY_CODE(another_something, another_something32);
etc...
答案 0 :(得分:2)
根据条件改变您的逻辑并更改宏的定义 - 而不是定义包含条件的宏:
// define
#ifdef something32
#define SOMETHING_VAR something32
#else
#define SOMETHING_VAR something
#define SHORTEN_MY_CODE the_real_value = thing[SOMETHING_VAR]; \
thing[SOMETHING_VAR] = my_value;
#ifdef THE_OTHER_THING
#define SHORT_OTHER() thing32[SOMETHING_VAR] = my_value
#else
#define SHORT_OTHER()
#endif
// usage
SHORTEN_MY_CODE()
SHORT_OTHER()
原始回答
#ifdef something32
#define MY_MACRO the_real_value = thing[something32]; \
thing[something32] = my_value;
#else
#define MY_MACRO the_real_value = thing[something]; \
thing[something] = my_value;
#endif
答案 1 :(得分:0)
如果您正在使用C ++,我会考虑编写一个函数并将其声明为内联函数。如果你有一个完整的函数,那么你可以将#ifdef放在函数中。
如果您发布更多代码,我认为我们可以提供更多帮助。滥用c预处理器非常频繁。您可能不希望以您的建议方式使用它。
我不明白如何定义something
,something32
和OTHER_THING
。它们是在项目级别定义的,还是在某个头文件中定义的?
更新:建议。但是,您可能需要先阅读此内容:access to the sys_call_table in kernel 2.6+
void* Hook(int f, void* hooked) {
#ifdef CONFIG_IA32_EMULATION
void *old = ia32_sys_call_table[f];
ia32_sys_call_table[f] = hooked;
#else
void *old = sys_call_table[f];
sys_call_table[f] = hooked;
#endif
return old;
}
...
Hook(__NR_read, hooked_sys_read);
Hook(__NR_write, hooked_sys_write);