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

2 回答 2

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
于 2013-04-18T21:50:17.000 回答
0

如果您正在使用 C++,我会考虑只编写一个函数并将其声明为内联。如果你有一个完整的函数,那么你可以把#ifdef放在函数里面。

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

我不明白如何定义something。它们是在项目级别定义的,还是在某个头文件中定义的?something32OTHER_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);
于 2013-04-19T19:37:21.187 回答