gpt4 book ai didi

c - 可移植仪器

转载 作者:太空宇宙 更新时间:2023-11-04 06:38:33 27 4
gpt4 key购买 nike

GCC 有一个很好的检测功能,它允许您在每次调用函数或每次函数返回时调用例程。

现在,我想创建自己的系统以使其可移植到其他编译器,并允许工具化我想要的函数(参数数量可能会有所不同),所以我在考虑两种情况下的两个宏.我正在考虑制作某种配置文件,它只能通过定义子句激活。

#define FUNCT(t,function_name,...)   \
(t) function_name(...) { \
(void) *func_pointer = &(function_name); \
start_data(func_pointer, myclock());

#define RETURN(x) {stop_data(func_pointer, myclock()); return (x);}

FUNCT(BOOL, LMP, const int prof, const int nmo))
if (nmo <= 5 ||
prof > (prof_l / 3)) {
.... do long operations....
RETURN(FALSE);
}
... do more....
RETURN(TRUE);
}

但我无法让它工作。有人可以帮我弄这个吗?或者这是一项很难完成的任务?

我想到的另一个选择是让函数在没有宏的情况下声明,如果无论如何都知道函数指针而不知道它的名字,就像在 VB 中调用 Form with Me 时那样,它是一个通用别名。可能吗?

最佳答案

使用 gcc -E 调试您的宏。使用您发布的代码:

$ gcc -E t.c
# ... skip stuff ....

(BOOL) LMP(...) { (void) *func_pointer = &(LMP);
start_data(func_pointer, myclock());)
if (nmo <= 5 ||
prof > (prof_l / 3)) {
.... do long operations....
{stop_data(func_pointer, myclock()); return (FALSE);};
}
... do more....
{stop_data(func_pointer, myclock()); return (TRUE);};
}

(我添加了一些空格以使其可读。)

您会立即看到两个问题:函数参数没有像您想象的那样展开,并且从某处有一个额外的 )

要获取扩展的可变参数,请使用 __VA_ARGS__,而不是 ...。迷路的 ) 在调用站点。

所以:

#define FUNCT(t,function_name,...)   \
(t) function_name(__VA_ARGS__) { \
(void) *func_pointer = &(function_name); \
start_data(func_pointer, myclock());

#define RETURN(x) {stop_data(func_pointer, myclock()); return (x);}

FUNCT(BOOL, LMP, const int prof, const int nmo)
if (nmo <= 5 ||
prof > (prof_l / 3)) {
.... do long operations....
RETURN(FALSE);
}
... do more....
RETURN(TRUE);
}

至于这是否值得尝试(可变参数宏随 C99 一起提供,并非所有编译器都实现该标准,并且支持可能因编译器而异),我不确定。您可能最好使用每个编译器的 native 分析工具 - 您将获得更好的结果,并有望减少开销。

关于c - 可移植仪器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11867008/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com