使用易失性时 AnsiString [] 访问出现意外语法错误

Unexpected Syntax error with AnsiString [] access when volatile is used

提问人:Spektre 提问时间:10/16/2023 最后编辑:Remy LebeauSpektre 更新时间:10/17/2023 访问量:43

问:

最近,我需要使用 ,并撞到一些像这样的墙:volatile AnsiString

volatile AnsiString s;
s="123456";
s[2]='X'; // <- [C++ Error] Unit1.cpp(17): E2277 Lvalue required

Q1 为什么会导致编译错误?

这是在 BDS 2006 上,我还没有尝试过 RAD Studio 11(我在遗留代码中需要它)。

我可以像这样解决它:

volatile AnsiString s;
s="123456";
char *c=s.c_str(); c[1]='X';

但我想知道发生了什么。

Q2 有没有更好的选择来代替 AnsiString,它更适合 volatile

编译器错误 c++builder

评论

0赞 Remy Lebeau 10/17/2023
你为什么需要?这毫无意义,在我使用 C++ Builder 的 25+ 年中,我从未见过任何人需要使用(或任何其他字符串类)。这里的用例是什么?AnsiStringvolatilevolatileAnsiString
0赞 Spektre 10/17/2023
@RemyLebeau我也不是,它被用作线程之间共享的(非常古老的)类的一部分(成员)。问题源于 Win10 和更新的操作系统,进程调度再次发生了变化,使旧的遗留代码偶尔抛出异常(在 AnsiString 本身的锁定/关键部分 VCL/RTL 代码中)与多线程但仅限于某些机器(情况仍然未知),所以我尝试在完全重写东西之前测试它是否有帮助,这将需要一段时间......作为其 ~20 年前的遗留代码AnsiStringvolatile
1赞 Roger Cigol 10/17/2023
挥发性无助于解决这个问题。它所做的只是告诉编译器不要优化变量的任何用途。如果线程之间的接口构造不佳,则需要深入研究并找到问题所在,并使用正确的锁定方法解决它。
0赞 Spektre 10/18/2023
@RogerCigol很奇怪,但看起来(在受感染的机器上进行了 3 天的 24/7 测试后),(以及上述解决方法)帮助了我的问题,即使真的不需要易失性,正如 Remy 提到的(它在已经锁定的代码中),但这可能只是巧合,只有时间会证明一切,因为这件事不容易重现。但是我们偏离了轨道,因为问题是关于编译器错误而不是多线程锁定问题......volatile AnsiString

答: 暂无答案