问题标签 [gcc9]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
181 浏览

c - 如何避免在我的 GTK3 应用程序中使用全局指针变量

我正在GTK3使用 On Linux(现在的 Linux mint 19)创建一个 CHAT 应用程序,C但我无法弄清楚如何在我设计整个程序的方式中避免使用全局(标签)指针。

有一个窗口,它有一个按钮、一个条目和一个标签。当用户键入内容并按 Enter 或按下按钮时,应在标签部分打印消息。

一切都很好,除了我使用全局指针来更新我想避免它的标签,并在 Signal 函数中使用它。

这是一个编译良好并且可以测试的工作示例:

0 投票
1 回答
1867 浏览

c++ - 编译器错误:在此上下文中是私有的,仅在带有 c++17 的 gcc9 上

我使用 travis 测试我的代码。最近有人将 gcc9 添加到测试代码的编译器集中。虽然使用 gcc8(使用 c++14 和 c++17)和使用 c++14 的 gcc-9.1.0 都可以正常编译,但使用 c++17 的 gcc-9.1.0 会失败,并出现以下错误:

引发此错误的代码如下:

我使用下面的代码让travis CI使用对应的编译器

类 Statement 有一个私有复制构造函数和赋值运算符,但我想知道为什么这会在这里引起任何问题,因为我没有复制 Statement“查询”。尤其是为什么这个问题只发生在带有 c++17 的 gcc-9.1.0 上(在我的本地机器上,我使用 gcc-9.1.1 并且编译时没有任何错误)。

0 投票
1 回答
334 浏览

c++ - c++ - 在向量中使用 std::filesystem::path 时双重释放

我正在使用DearImgui开发一个简单的文件浏览器。为此,我将 std::filesystem 与 g++-9 一起使用,目前正在 Kubuntu 19.04 上进行测试。在大多数情况下,该程序按预期工作。一个按钮用于下降到父目录,并且可以通过双击打开子目录。大多数时候,我可以毫无问题地浏览整个文件系统,但是某些命令组合会导致程序中止。确切的错误消息各不相同,但总是与双重释放错误有关。

在将 std::filesystem 添加到我的应用程序之前,我使用的是 g++-8 (Ubuntu 8.3.0-6ubuntu1)。但是,在调用与文件系统相关的内容后,该程序继续出现段错误。这似乎是一个已知问题,应使用 8.3.0-7 (source)修复。与此同时,我决定使用 g++-9 (Ubuntu 9.1.0-2ubuntu2~19.04)。我不确定这是否是我的问题的原因。

这是导致中止的代码:

当使用 Valgrind 运行程序时,它会在更新路径向量和未初始化条件时报告泄漏。尝试将所选路径复制到当前路径时,主要错误似乎是无效读取。

一个可重现的示例需要 SDL2 和 imgui。如果有人感兴趣,我可以发一个。

有趣的是,当我在 gdb 中运行程序并触发中止时,我无法再使用鼠标单击任何内容(甚至是不相关的应用程序,例如 firefox)。我仍然可以使用键盘并通过命令行杀死 gdb。在这个项目中以前没有发生过类似的事情,我无法在程序的无关部分中重现它。这可能是由 Imgui 引​​起的,但我对此表示怀疑。

0 投票
1 回答
4363 浏览

c++ - 如何使用 GCC 9 将 `std::filesystem::file_time_type` 转换为字符串

我正在尝试将文件的修改时间格式化为字符串(UTC)。以下代码使用 GCC 8 编译,但不是 GCC 9。

我尝试了decltype(file_time)::clockand std::chrono::file_clock,同时使用了 C++17 和 C++20,但它们都不起作用。

https://en.cppreference.com/w/cpp/filesystem/file_time_type上的示例提到它不适用于 GCC 9,因为 C++20 将允许可移植输出,但我不知道如何获取它在职的。如果我不使用 C++20,它不应该与 GCC 9 一起使用吗?

如果可能的话,我更喜欢使用 GCC 9 的 C++17 解决方案。

0 投票
3 回答
709 浏览

c - 获得左移负数的警告

我正在尝试为左移负数时未定义的行为生成警告。根据这个答案,C中负数的左移是未定义的。

E1 << E2 的结果是 E1 左移 E2 位位置;空出的位用零填充。如果 E1 具有无符号类型,则结果的值为 E1×2E2,比结果类型中可表示的最大值多模一减少。如果 E1 有带符号类型和非负值,并且 E1×2E2 在结果类型中是可表示的,那么这就是结果值;否则,行为未定义。

我试图了解为什么我没有收到此代码的警告: x << 3

gcc -Wall(版本 9.1.0)

另外,我也没有收到关于左移负数的警告 z << x

0 投票
1 回答
908 浏览

c++ - __FLT_MAX__ 和 __DBL_MAX__ 为 0?

在 GCC 9.1 中,当使用浮点类型调用 std::numeric_limits 的函数时,它们在大多数情况下返回 0。

这发生在我正在处理的项目中,MSVC、GCC 8.3 或 Clang 8.0 没有问题。<double>::epsilon()有时具有正确的值,但是当从其他文件调用时,它也可能评估为 0。

<int>::max()此处留作参考)

产生一个独立的文件(正确的值):

项目结果:

独立编译专用文件时,这些值是正确的:问题不是来自 GCC(正如我所料),但很可能来自项目的配置。

编辑:独立编译项目文件(目前出现此问题)也可以提供正确的结果。随着gcc -dM -E__DBL_MAX__被定义为double(1.79769313486231570814527423731704357e+308L)

__DBL_MAX__值被定义,被 ifdef 包围的代码被执行:

GDB 给出了相同的精确值,所以输出部分没有问题。输出XXX_YYY__XXX_YYY__给出相同的结果,因为 numeric_limits 的函数无论如何都会调用它们。

100%明确:std::numeric_limits<double>::max() == 0返回true,所以输出部分没有问题。它只是留在这里作为参考。

GCC 产生这种行为的原因可能是什么?反正不是__XXX_YYY__内置值吗?他们怎么可能持有0?

0 投票
1 回答
153 浏览

filesystems - 使用 directory_iterator 时文件名 c_str() 损坏

directory_iterator在使用之前存储文件名称的目录中的所有文件时,c_str()会导致无效读取(和垃圾输出)。

这对我来说似乎很奇怪。

代码示例:

在职的:

valgrind 没有报告错误。

损坏的输出:

valgrind 报告 159 次无效读取(大小为 1)——确切数字取决于目录中有多少文件。

这两个片段都已使用 gcc 9.1 使用以下命令编译: g++-9.1 test.cpp -std=c++17

0 投票
1 回答
136 浏览

c++ - ': 错误: '<insert function here>' is not a member of 'std' ' 移动源文件后

在将源文件从我的项目移动到子目录之后,gcc 吐出一个奇怪的错误(之前它确实编译得很好)

我确实设法通过在所述头文件中包含 < string > 来“解决”该问题,但是出现了一个新的,甚至更奇怪的错误。

在这一点上,我什至尝试在其他任何地方的任何其他包含之前包含 < algorithm > ,但这根​​本没有帮助。相反,它抛出了这个更奇怪的错误......

现在,有没有人知道为什么会发生这种情况/我能做些什么来解决这个问题?

此外,这是错误输出中提到的代码。

主文件

主文件

调试/调试.h

最后是 Makefile.am

0 投票
1 回答
355 浏览

c++ - 无法从 basic_stringstream 读取 char8_t

我只是stringstream在 UTF-8 中尝试:

编译使用:

屏幕上的结果是:

阅读时似乎出了点问题c,但我不知道如何纠正。请帮我!

0 投票
0 回答
342 浏览

c++ - -Wclass-memaccess 带有 boost::endian 和 gcc 的警告

我得到了一个-Wclass-memaccessgcc >= 8 ,我想知道我是否可以安全地忽略警告。

测试用例:

在魔杖盒上试试

背景:这种类型的代码用于解码二进制网络流量,memcpy 用于安全,具有严格的别名规则。

在更大的代码库上更广泛地使用该模式之前,我想确保它没有缺陷。

我的印象是复制到 boost::endian 缓冲区是安全的。奇怪的是,当缓冲区是指向的指针时没有警告char,但只有当缓冲区是指向的指针时std::byte

完整的警告信息是: