如何让易变函数参数发挥作用?

问题描述 投票:0回答:1

我对C++完全没有经验,我一直在使用C语言。在我最近的爱好项目中,我需要在我的C代码中混入一个C++库,从而迫使我有一个C++ main.cpp。

我现在正在把我的C代码调解为C++编译。除了一个我根本无法解决的问题外,这甚至还很好用。

这是一个中断服务,每秒钟递增我的unix时间变量,并且在递增后还会转换为spli-up时间格式。由于这是在中断中发生的,我将变量设置为易失性。

volatile time_t UNIX_TIME = 0;
volatile struct tm TIME_CUR_LOCALTIME;  

if (htim == &htim2){
    UNIX_TIME++;
    TIME_CUR_LOCALTIME = *localtime(&UNIX_TIME);
}

从库中的time.h。

struct tm *localtime (const time_t *_timer);

h: With gcc 这个编译完美无瑕。

g++ 但这是一个不同的故事。它给我的错误是

错误:将'volatile tm'作为'this'参数时,丢弃了限定符[-fpermissive] 。

我试过多次投掷和其他东西,唯一能让它自己开始工作的方法是当我放弃了 两者 挥发性的限定词。但我不希望这样。

正确的方法是什么呢?我已经没有办法了。

c++ volatile
1个回答
0
投票

先把时间复制到一个非易失性实例中。

time_t t = UNIX_TIME;
tm local = *localtime(&t);
TIME_CUR_LOCALTIME.tm_sec   = local.tm_sec;
TIME_CUR_LOCALTIME.tm_min   = local.tm_min;
TIME_CUR_LOCALTIME.tm_hour  = local.tm_hour;
TIME_CUR_LOCALTIME.tm_mday  = local.tm_mday;
TIME_CUR_LOCALTIME.tm_mon   = local.tm_mon;
TIME_CUR_LOCALTIME.tm_year  = local.tm_year;
TIME_CUR_LOCALTIME.tm_wday  = local.tm_wday;
TIME_CUR_LOCALTIME.tm_yday  = local.tm_yday;
TIME_CUR_LOCALTIME.tm_isdst = local.tm_isdst;

0
投票

无论是C标准还是C++标准都没有试图区分哪些对象会被修改,哪些对象会以编译器没有理由期待的方式被修改,哪些对象只会以编译器理解的方式被写入,但也可能以编译器没有理由期待的方式被读出,哪些对象虽然被声明为 volatile事实上,永远不会以编译器所不期望的方式被访问(后一种情况可能会出现在库中,这些库有时会被用于通过外部方式访问的系统中,有时会被用于没有被访问的系统中)。 所有可能会以编译器不期望的方式被访问的非原子对象都必须被限定为 volatile因为--从标准的角度来看--所有的对象都是合格的。volatile 可能会被任意的外部手段读取或写入,任何对这样一个对象的访问,如果不经过一个 volatile 限定符调用未定义行为。不考虑是否有外部访问. 该标准的作者可能认识到,由于希望出售编译器的人会理智地处理这种情况,而不考虑是否要求他们这样做,因此该标准没有必要处理这种情况。 然而,并不是所有的编译器编写者都会受到这一原则的约束。

要实现这里所讨论的行为,最好的方法可能是复制 UNIX_TIME 到几个普通对象,确保它们匹配,如果不匹配则重复读取尝试,然后将其地址传递给任何需要持有时间的对象地址的函数。 正如在其他地方所指出的,我们应该避免使用类似于 localtime 使用静态缓冲区的,使用类似于 localtime_r但如果想关闭编译器,最重要的是在使用前将对象复制到其他地方。

© www.soinside.com 2019 - 2024. All rights reserved.