c - C语言:如何使用宏作为装饰器?

标签 c macros

我有一个手工的C程序剖析运行在ARM嵌入系统这是一个“侵入性”的,这意味着每当我想分析一个函数时,我需要在函数的开头和结尾添加一些代码,比如:

int f(int a, int b) {
  BeginProfiling("f");
  ...
  EndProfiling();
}

我想知道有没有更好的办法我是说,如果我使用Python,我肯定会使用decorator有没有更好的解决方案可以使用C宏来拥有一个类似decorator的寄存器机制我希望代码如下:
__PROFILING__
int f(int a, int b) {
  ...
}

最佳答案

#include <stdio.h>

#define PROFILE2(fun, a, b) mkprofile2args(#fun, fun, a, b)

typedef int (*signature2args) (int, int);

void
profiler_begin(char const*m)
{
printf("START %s\n", m);
}

void
profiler_end(char const*m)
{
printf("END %s\n", m);
}

int
mkprofile2args(const char* m, signature2args fun, int a, int b)
{
  profiler_begin(m);
  int res = fun(a, b);
  profiler_end(m);
  return res;
}


int
function_add(int a, int b)
{
  return a+b;
}

#define function_add(a, b) PROFILE2(function_add, a, b)

void
main(void)
{
  printf("%d\n", function_add(10, 20));
}

#undef function_add

关于c - C语言:如何使用宏作为装饰器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45583824/

相关文章:

将 char 数组元素转换为大写或小写

在 Windows 的 Xcode 中编译(控制台)

c - 在 C 中使用 Strcmp

CPP_Magic IF_ELSE 宏?

ios - swift : Multiple targets handling: macros not working

c - 使用内联 asm 在 C 中强制消除尾调用

c - MQTT 最后遗嘱不保留

c++ - 为什么不能将字符串文字连接到 __FUNCTION__?

取决于 gcc 开关的条件代码

macros - Racket 与 Scheme 宏