我是否可以知道变量是否已更改其值而不将其与函数调用C中的先前值进行比较?

kri*_*hna 2 c c++

用于遵循C/C++代码

void fun(int* x)
{
    //SOMECODE;//WITHOUT SAVING PREVIOUS VALUE
    if(SOME CONDITION)
    printf("VALUE OF X IS DIFFERENT THAN PREVIOUS CALL \n");
}

int main()
{
    int a;
    a=9;
    fun(&a);
    a=12;
    fun(&a);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

是否有任何函数或标志值给我们提供有关变量是否变更的信息,如果有任何解决方案请回复

mik*_*yra 5

如果没有提供一些额外的代码来存储参数"中""最后"你的函数调用有一点机会都没有检测到,如果用相同的值或另一个叫.

由于x 的'当前'值将存在于堆栈中,只有在函数调用完成后它才会完全丢失.

前期多线程时代只使用一个静态变量的函数的最后运行期间缓存x的值func可能(几乎)已经解决了你的问题:

void fun (int x) {
    static int old_value = VALUE_INVALID;

    if(x != old_value)
       printf("VALUE OF X IS DIFFERENT THAN PREVIOUS CALL \n");

    old_value = x;
}
Run Code Online (Sandbox Code Playgroud)

仍然采用这种方法的唯一问题是重新入门 - 这意味着如果func在信号处理程序中调用缓存值,可能会搞砸.

如果在多线程应用程序中运行,则在使用此方法时还必须提供某种锁定机制,否则您迟早会搞砸.

可能你会在这种情况下被搞砸了,因为你必须澄清执行过程中" 最后"对函数和值调用是什么意思.

当前正确的值是在线程B之前输入func但仍在执行的线程A或者在B之后输入但已经完成func执行的线程B的当前值?


Ben*_*igt 2

再次阅读您的问题,您不是在检查变量是否发生变化,而是在检查同一词法标识符的两个不同实例是否不同。

除非通过显式比较,否则这是不可能的。


关于检测变量变化的原始答案:

在可移植的标准 C 或 C++ 中没有办法。

但是,有一些特定于环境的方法可以检测变量何时发生更改。您可以使用 MMU 访问控制标志(通过mprotectVirtualProtect)在第一次写入时生成异常,并从处理程序内部设置脏标志。(几乎每个现代操作系统都会使用内存映射文件来执行此操作,以确定是否需要将其写回磁盘)。或者您可以使用硬件断点来匹配对该地址的写入(调试器使用它来在变量上实现断点)。

与旧值相比,这些都不会那么有效。(但与旧值相比会错过ABA场景)