如何#define in a macro(或者替代)

时间:2013-04-18 21:47:07

标签: c macros

我有这段代码:

#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...

2 个答案:

答案 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预处理器非常频繁。您可能不希望以您的建议方式使用它。

我不明白如何定义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);