嗨我有状态lambda表达式的问题.
这是一个虚拟的例子,但在我看来,ms编译器做错了什么,或者我有一些未定义的行为?
码:
int main() {
auto start = [x = 1, z = 1]() mutable {
goto resume;
for (; ; ++z) {
for (x = 1; x < z; ++x) {
resume:
std::cout << z;
if (z > 3)
return 1;
}
}
};
start();
}
Run Code Online (Sandbox Code Playgroud)
Microsoft编译器版本19.16.27024.1
cl -O2/std:c ++ 17(或-O1,-Ox)----->打印'1'然后打印无限数'2'(错误我认为)
cl -Od/std:c ++ 17 ----->打印12334
g ++(Ubuntu 7.3.0-27ubuntu1~18.04)7.3.0
g ++ -03 ----->打印12334
clang version 8.0.0(trunk)clang ++ -O3 ----->打印12334
https://godbolt.org/z/wsHYA-(代码但没有std :: cout)
删除for循环后(这个带有x变量)问题不再可见; 如果somone想知道我为什么编写这样的代码 - 我想模仿协同程序等的行为(没有什么严重的,例如序列生成器)
我有一些Qt国际象棋应用程序。当我使用VS编译器或gcc进行构建时,一切正常,但是使用emscripten的Web程序集版本存在问题。当我使用emrun运行html时,一切正常,但图像未显示出来。
我的emscripten版本是emcc(Emscripten gcc / clang-like替换)1.38.30(commit d33f7a29002a2463a7956cd53a559b97a52f9560)。
我的qmake版本:QMake 3.1版
我的Qt版本:使用Qt版本5.13.0
我正在使用来自wasm的在线linux安装程序的官方Qt二进制文件。
我正在使用emrun --no_browser .html命令在本地主机上设置服务器。
我尝试了各种路径规范。我最终得到了这个代码示例,可以正常运行,但不适用于Web程序集版本。这是加载示例图像的代码。
...
QDir::setSearchPaths("qrc", QStringList(":/"));
return QIcon(QUrl("qrc:///Images/king_white.svg").toString());
Run Code Online (Sandbox Code Playgroud)
这是我的.qrc文件:
<!DOCTYPE RCC><RCC version="1.0">
<qresource>
<file>Images/king_black.svg</file>
...
</qresource>
</RCC>
Run Code Online (Sandbox Code Playgroud)
在.pro文件中,我还有:
RESOURCES = resources.qrc
Run Code Online (Sandbox Code Playgroud)
当我不使用emscripten时,它可以正常工作。感谢帮助。
编辑:构建选项(从qmake生成的Makefile中)
CC = emcc
CXX = em++
DEFINES = -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB
CFLAGS = -pipe -O3 -s ALLOW_MEMORY_GROWTH=1 -Wall -W $(DEFINES)
CXXFLAGS = -pipe -O3 -std=gnu++1y -s ALLOW_MEMORY_GROWTH=1 -Wall -W $(DEFINES)
INCPATH = -I. -I../../Qt513/5.13.0/wasm_32/include -I../../Qt513/5.13.0/wasm_32/include/QtWidgets -I../../Qt513/5.13.0/wasm_32/include/QtGui -I../../Qt513/5.13.0/wasm_32/include/QtCore -I. -I/home/somas/.emscripten_ports/openssl/include -I../../Qt513/5.13.0/wasm_32/mkspecs/wasm-emscripten
QMAKE = /home/somas/Qt513/5.13.0/wasm_32/bin/qmake
DEL_FILE = …Run Code Online (Sandbox Code Playgroud)