如何检查一个函数是否被另一个函数调用
How can I check a function was called by another function?
我目前正在努力确保一个类的成员函数仅被另一个类中的成员函数调用。
体系结构是强加的,不能更改,端口意味着在调用b.call()
之前必须在a.call()
中完成一些逻辑。因此a.call()
调用b.call()
来简化事情并确保顺序得到遵守。
我找到了这个问题的答案。只是,问题是我使用的是类,并且这两个类具有相同的成员函数名,因此#define
试图替换所有具有不同原型的出现。
我推荐使用密钥模式。它非常适合对谁可以使用您的函数进行操作进行细粒度控制。
在我的脑海中,选项是:
- 将
b.call
设为私有,并使b
将a
或a.call
添加为friend
- 将
b.call
转换为一个类,并将主体放入一个私有构造函数中,a
或a.call
作为friend
- grep
b.call
的源代码,确保唯一的调用在a.call
中,并在声明处添加一条注释,说明"如果调用此函数,您将被解雇" - 更改
b.call
,使其至少将所需的一个值作为参数(即使它忽略它并使用其他地方的值)
是否可以将b.call
更改为引用a
?这样,b.call
可以调用a.call
本身:
struct A {
void call() {
// do stuff
}
};
struct B {
void call(A & a) {
a.call();
// do stuff
}
};
这确保了CCD_ 22总是在执行CCD_ 23的其余部分之前被调用。
使用标志怎么样?
a.call()
{
// ...
flag = 1;
b.call();
flag = 0;
}
b.call()
{
if (flag == 0)
return;
// ...
}
如果你为某个平台(比如x86或x64)编程,并且你知道调用约定(例如cdecl),那么你可以从堆栈中获得这些信息
假设您想要检查调用该函数的对象,那么在调用成员函数之前使用推送到堆栈的this
指针:获取this
指针并将其与您想要的对象(this_pointer == a
)进行比较
如果要检查某个函数,请从堆栈中获取调用方地址,并对照该函数进行检查:caller_address == A::call
。如果它是一个虚拟函数,请使用this
指针来获取vtable
。
根据调用约定和在堆栈上推送变量的顺序,您可能必须首先检查输入变量的大小,才能获得所需的信息。
相关文章:
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 是否有类似std::lower_bound的函数,而不需要排序/分区输入
- 函数作为模板参数,是否对返回类型强制约束
- visual是否可以在c++中创建一个接收无限数量相同类型(或至少相当数量)参数的函数
- 编译器如何在使用SFINAE的函数和标准函数之间确定两者是否可行
- 函数是否可以访问传递给main()的参数
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- 在这种情况下,java对象是否可以调用本机函数
- 检查函数返回类型是否与STL容器类型值相同
- 根据某个函数是否存在启用模板
- 在C++中,使用带有 std::optional 参数的函数<T>来表示可选参数是否有意义?
- 无论如何,我可以确定构造函数是否存在吗?
- 是否可以将函数导入命名空间,但不能导出它?
- 返回指向对象的指针的函数调用是否为 prvalue?
- 是否可以依赖函数范围的静态变量来执行程序关闭期间调用的方法?
- 重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?
- 是否有任何建议来统一函数类型限定符并简化可恶的函数类型?
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本