代码之家  ›  专栏  ›  技术社区  ›  Greg

在C++中的每个函数调用之前运行代码

  •  6
  • Greg  · 技术社区  · 15 年前

    我想在每个函数调用一个类以及从该类继承的类的所有函数之前运行一些代码(可能是函数)。我想在不实际编辑每个函数的情况下完成这项工作,这样的事情是否可能?

    我决定让一个被调用的函数作为每个函数调用的第一条指令,而不是在前面被调用。

    9 回复  |  直到 10 年前
        1
  •  8
  •   notnoop    15 年前

    AspectC++ 是你想要的。我自己没用过,但是 Aspect-Oriented Programming 范例试图解决这个确切的问题。

        2
  •  3
  •   ovanes    15 年前

    我建议使用非虚拟接口习惯用法。所有公共功能都是非虚拟的。所有虚拟功能都是受保护的或私有的。公共成员将调用委托给虚拟成员,通常作为内联函数实现。

    这就是iostreams在STL中实现的方式。您可以在 C++ Wikibooks .

    目的:在一个位置为整个类层次结构模块化/重构通用的代码片段前后(例如,不变检查、获取/释放锁)。

    当做,
    奥凡内斯

        3
  •  3
  •   ossandcad    15 年前

    下面可能有点过分了,但是怎么样?

    http://msdn.microsoft.com/en-us/library/c63a9b7h.aspx

        4
  •  2
  •   Nick    15 年前

    你可以考虑的另一件事是使用[Boosi/C++0x] SaldypPTR包装器,在返回类实例指针之前,在'-& gt;''过载下调用自定义函数。它涉及修改使用,但不涉及基础类,我已经用了几次它来实现相同的效果。只是另一个想法。

        5
  •  1
  •   Janusz Daniel Rindt    15 年前

    构建一个包装类的方法有点不方便,它采用一个基本类型的对象,调用周围的函数,然后调用您想要调用的函数。这就像是 decorator .

        6
  •  1
  •   Raymond Martineau    15 年前

    最好的方法是声明一组虚拟函数受保护,让从类继承的开发人员重写虚拟函数。基类使用的接口可以是公共的,它在将信息传递给受保护的虚拟方法之前执行所需的代码。

    例如:

    class Base {
      public:
        void MyMethod(void) { /* Insert code here */ YourMethod(); }
      protected:
        virtual void YourMethod(void) {}
    };
    

    如果开发人员知道他有一个特定的子类,他仍然可以通过使用一个动态类型转换和自己的方法集来绕过您的代码。因此,您可能希望遵循已经发布的不涉及基础C++语言的其他建议。

        7
  •  0
  •   Jay    15 年前

    这听起来像是分析器所做的。您是否查看过任何分析工具的源代码?

        8
  •  0
  •   oz10    15 年前
        9
  •  0
  •   ovenror    10 年前

    使用 g++ ,您可以使用该选项 -pg 对于各自的编译单元,这使得编译器生成对函数的调用 mcount 在每个函数的开头。 麦克伯特 通常由以下分析工具提供 gprof ,但您也可以自己实现它。不过,你应该确保

    • 麦克伯特 具有C链接(而不是C++风格的名称被篡改),即将它作为C函数实现,并用纯C编译器编译。 gcc .
    • 编译单元包含 麦克伯特 不是用编译的 -PG .