3

我打算在不更改任何实际代码的情况下调整(或获取有关)程序功能的信息。我最初希望这可以通过使用 C++ 运算符重载功能来完成,但最初的测试并不令人满意。

具体的

我在sample.c文件中有一个简单的函数:

void dunno() {
    int x = 1;
    int y = 4;
    int z = x + y;
}

为了改变功能,我创建了一个头文件(在我的脑海中),如下所示:

...

int operator+(int x1, int x2) // this syntax is obviously not allowed by C++?
{
    // Change and gain knowledge here!
    return something here;
}   


#include "sample.c"

...

换句话说:我试图改变例如两个正在添加的整数的真正含义。最重要的是,当未修改的函数试图添加两个整数时,应该调用我的运算符重载函数而不是标准的 C int+int...

对不起,伙计们,很难体面地解释我想说什么。

4

2 回答 2

4

是的,您可以这样做,但前提是至少有一个操作数是用户定义的类型(这意味着您的示例int不起作用),并且该类型还没有该运算符的定义(或者您会得到多个定义错误)。

于 2012-09-27T16:06:07.153 回答
2

您可以通过为要拦截的每个原语编写一个值包装类(或使其成为存储类型上的模板),然后使用宏来完成这项工作,如下所示:

template <typename T> class Primitive;
template <typename T>
Primitive<T> operator+(Primitive<T>, Primitive<T>);

template <typename T> class Primitive {
    T value;
public:
    typedef Primitive<T> MyType;
    Primitive<T>(T);
    // ...    
    friend MyType operator+<T>(MyType, MyType);
    // etc. etc.
};


#define int Primitive<int>
#include "sample.c"
#undef int

...

但这会变得难以想象,你真的不应该这样做。

要理解的关键是你会通过这样做来改变代码,很难确定行为改变了多少。此外,它只会破坏sample.c声明外联函数或变量所包含的任何标头。

一个更好的方法可能只是在调试器中单步调试代码,如果你真的想看看它到底做了什么(或者,如果合适的话,dunno它的数据类型的模板,这样你就可以在没有宏hacky的情况下传递调试值类型)。

于 2012-09-27T16:24:52.677 回答