2013-04-18 25 views
2

#定义我有这样的代码:如何在宏(或替代)

#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

'#ifdefs'不能在宏中,但宏可以在#ifdef中。 –

+0

@CarlNorum对不起,我会编辑我的问题,你会明白我为什么不能使用它。 – alexandernst

+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 
+0

对不起,我的编辑 – alexandernst

+0

@alexandernst是否必须使用#ifdef或可以使用三进制。编译器会优化在这种情况下永远不会发生的分支 –

+0

不,我不能定义'''something32'''。无论如何,''''''''是担保被定义的。 – alexandernst

0

如果你正在做C++,我会考虑写一个函数并声明它内联。如果你有一个完整的功能,那么你可以在函数中加入#ifdef。

如果您发布了更多代码,我认为我们可以提供更多帮助。滥用c预处理器非常猖獗。你可能不想按照你的建议来使用它。

我不明白somethingsomething32OTHER_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); 
+0

我使用的是C/C++,所以这是一个选项。 OTHER_THING是CONFIG_IA32_EMULATION(Linux Kernel),而something和something32是' ''(sys_calls)。 '''__NR_read'''将永远存在,不管架构如何,只有''__NR_read32'''只会在x64和IA32仿真激活时才存在。另外,请记住,这不是唯一的sys_call(还有更多)。 – alexandernst

+0

仍然需要更多示例代码......如果您正在使用库符号(如'__NR_read')作为某些数组的偏移量,那么显然您会玩火。如果你用C编写汇编代码,你使用的是错误的工具.... –

+0

好的,这里是实际的代码:https://github.com/alexandernst/procmon/blob/master/syshijack.h和https:/ /github.com/alexandernst/procmon/blob/master/hookfns.c – alexandernst