volatile变量作为函数的参数

Her*_*che 8 c warnings pointers arguments volatile

有这个代码:

typedef volatile int COUNT;       

COUNT functionOne( COUNT *number );

int  functionTwo( int *number );
Run Code Online (Sandbox Code Playgroud)

我无法摆脱一些警告..

我在functionOne原型上得到了这个警告1

函数返回类型时忽略[警告]类型限定符

我得到这个警告2,无论我用一个COUNT 指针参数而不是一个int指针调用functionTwo

[警告]从指针目标类型中抛出限定符

显然变量/指针不能"强制转换"为volatile/un-volatile ..但是每个参数都必须指定为volatile吗?那么如果已经为非易失性变量定义了库函数怎么用呢?

编辑:使用gcc -std=c99 -pedantic -Wall -Wshadow -Wpointer-arith -Wcast-qual -Wextra -Wstrict-prototypes -Wmissing-prototypes …

编辑:在Jukka Suomela建议之后,这是警告二的代码示例

typedef volatile int COUNT;       

static int functionTwo(int *number) {
    return *number + 1;
}

int main(void) {
    COUNT count= 10;
    count = functionTwo(&count);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

bta*_*bta 9

volatile关键字旨在应用于表示存储而不是函数的对象.volatile int从函数返回一个没有多大意义.函数的返回值将不会被优化掉(内联函数可能除外,但这是另一种情况......),并且没有外部actor会修改它.当函数返回时,它将返回值的副本传递给调用函数.volatile对象的副本本身不是volatile.因此,尝试返回一个volatile int将导致副本,将其转换为非易失性int,这就是触发编译器消息的原因.返回一个volatile int*可能有用,但不是volatile int.

volatile int将按值传递给函数会生成对象的副本,因此使用函数参数必然会涉及忽略限定符的转换.通过地址传递易失性是完全合理的,但不是价值.

根据C规范,行为volatile完全依赖于实现,因此YMMV.

你是否volatile以这种方式试图打败某种编译器优化?如果是这样,可能有更好的方法.

编辑: 考虑到您的问题的更新,您似乎可以以不同的方式处理此问题.如果你试图打败编译器优化,为什么不采取直接的方法,只是告诉编译器不要优化一些东西?您可以使用#pragma GCC optimize__attribute__((optimize))为函数提供特定的优化参数.例如,__attribute__((optimize(0)))应禁用给定函数的所有优化.这样,您可以使数据类型保持非易失性,并避免出现类型问题.如果禁用所有优化有点过多,您还可以使用该属性/ pragma打开或关闭单个优化选项.

编辑: 我能够编译以下代码,没有任何警告或错误:

static int functionTwo(int *number) {
    return *number + 1;
}

typedef union {
                int i;
    volatile    int v;
} fancy_int;

int main(void) {
    fancy_int count;
    count.v = 10;
    count.v = functionTwo(&count.i);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这种黑客 "技术"可能会产生某种奇怪的副作用,因此在生产使用之前要彻底测试.将地址直接转换为a的情况很可能没有什么不同(int*),但它不会触发任何警告.


tor*_*rak 3

我可能在这里偏离了基础,但易失性通常不是与堆栈内存区域相关的东西。因此我不确定下面的原型是否真的有意义。

volatile int functionOne(volatile int number);
Run Code Online (Sandbox Code Playgroud)

我不确定返回的整数如何是不稳定的。什么会导致 EAX 的值发生变化?这同样适用于整数。一旦值被压入堆栈以便可以作为参数传递,什么会改变它的值?