C宏只能更改函数调用而不是函数定义

时间:2018-05-29 13:38:18

标签: c macros c-preprocessor

我有类似的问题:Macro and function with same name

我希望宏只能更改函数调用而不是函数本身

#define original_function(a, b) replace_function(a, b)

uint64_t replace_function(int a, int b) {
    // some functionallity
}

uint64_t original_function(int a, int b) {
    // some functionallity
}

uint64_t main(uint64_t argc, uint64_t* argv) {
    original_function(10, 20);
}

这会导致更改原始功能定义

#define original_function(a, b) replace_function(a, b)

uint64_t replace_function(int a, int b) {
    // some functionallity
}

uint64_t replace_function(int a, int b) {
    // some functionallity
}

uint64_t main(uint64_t argc, uint64_t* argv) {
    original_function(10, 20);
}

我不能这样做(这是相关问题的答案)

uint64_t (original_function)(int a, int b) {
    // some functionallity
}

//...

我不能把这个定义放在函数

之后
uint64_t original_function(int a, int b) {
    // some functionallity
}

#define original_function(a, b) replace_function(a, b)

// ...

是否有可能在宏中定义只更改函数调用而不是函数定义? 或者我可以以某种方式定义一个宏来重命名原始函数(而不是调用),这样它就不会受到影响吗?

修改 我之后只能更改宏而不是代码...

1 个答案:

答案 0 :(得分:2)

您可以使用C预处理器“模式匹配”定义所在的行。要以有用的方式执行此操作,首先需要间接SECOND宏:

#define SECOND(...) SECOND_I(__VA_ARGS__,,)
#define SECOND_I(A,B,...) B

...那么间接GLUE

是有用的
#define GLUE(A,B) GLUE_I(A,B)
#define GLUE_I(A,B) A##B

...最后,“选择性地蓝色油漆”original_function当它自己出现在一个特定的线上时(这种方法需要弄清楚它在哪条线上,但我建议不要挑剔这个奇怪的要求):

#define original_function(a,b) \
   SECOND(GLUE(EXCEPT_FOR_LINE_,__LINE__),replace_function)(a,b)

因此,如果未定义第一个构造的标记,则此宏将使用original_function的两个参数展开replace_function。但是如果定义了第一个令牌,则令牌首先展开,然后选择 的第二个参数。这意味着,你可以这样做:

#define EXCEPT_FOR_LINE_6 ,original_function

...如果original_function实际上是在第6行定义的(并且未在第6行调用),那么最终的扩展看起来就像第6行的原始...在所有其他行上,它将生成对replace_function的调用。

This example在您的代码中使用此技术。作为奖励,此示例中的所有宏都是在命令行上定义的(根据您在注释中反映的预期用途)。