【问题标题】:How to #define in a macro (or alternatives)如何在宏(或替代方案)中#define
【发布时间】:2013-04-18 21:47:06
【问题描述】:

我有这个代码:

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

【问题讨论】:

  • #ifdefs 不能在宏中,但宏可以在#ifdef 中。
  • @CarlNorum 很抱歉造成混乱,我会编辑我的问题,你会明白为什么我不能使用它。
  • 我认为有一种正确的方法可以做您想做的事情,但我需要查看您的其余代码以提供帮助。
  • @MarkLakata 这就是全部。如果有帮助,我可以粘贴真实的代码。你要我做吗?

标签: c macros


【解决方案1】:

扭转你的逻辑并根据条件更改宏的定义 - 而不是定义包含条件的宏:

// 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

【讨论】:

  • @alexandernst 它必须使用#ifdef 还是可以使用三元。编译器将优化在这种情况下永远不会发生的分支
  • 不,我不能因为something32 可能没有被定义。无论如何,something 保证被定义。
  • @alexandernst 我现在能想到的最好的 - 它仍然减少了
  • 感谢您的更新,无论如何,这仍然缺少THE_OTHER_THING 的情况,这种情况总是会发生,就在 ifdef/else 之后。
  • 最后 - 1 个编辑没问题,最后一个有错误/否,即:something32 只是至少 20 个列表中的一个变量,所以我不能 #ifdef它。其中的一部分,最后 - 1 次编辑是我可能会使用的 :)
【解决方案2】:

如果您正在使用 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);

【讨论】:

  • 我正在使用 C/C++,所以这是一个选择。 OTHER_THINGCONFIG_IA32_EMULATION (Linux 内核),而 somethingsomething32__NR_read__NR_read32 (sys_calls)。 __NR_read 将始终存在,无论架构是什么,但 __NR_read32 将仅在 x64 和 IA32 仿真激活时存在。另外,请记住,这不是唯一的 sys_call(还有很多)。
  • 仍然需要更多示例代码...如果您使用诸如__NR_read 之类的库符号作为某个数组的偏移量,那么您显然是在玩火。如果你在用 C 编写汇编代码,那么你使用了错误的工具......
猜你喜欢
  • 1970-01-01
  • 2015-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多