gcc 相关问题

GCC是GNU编译器集合。它是Linux上事实上的标准C编译器,也支持许多其他语言和平台。

WinApi 和 Raspberry pi Pico 的串行通信问题

希望你一切都好。我在尝试与 RPi-Pico -> PC 进行串行通信时遇到了奇怪的问题。我从 Pico 发送 9 字节数据包(来自 ADC 的 8 字节数据 + )一次

回答 1 投票 0

FILE 必须是完整类型吗?

例如,我可以这样做: #包括 int do_something(FILE 文件[静态 10]) { ... } int 主函数(无效) { 文件文件[10] = {}; do_something(文件); } 在 Linux 上,这可以编译...

回答 1 投票 0

使用带有列表初始化的指定初始化器时,类模板参数推导失败

在初始化结构模板实例时,使用大括号 init 语法和指定的初始值设定项时,编译器(GCC 和 Clang)会出错。 这里: 模板 是...

回答 1 投票 0

无法静态链接libcurl和动态链接其他库

我正在尝试使用curl-config --static-libs,它应该静态链接libcurl,但动态链接libcurl自己的所有依赖项。 这一切都在当前的 ubuntu Nobel 容器中 根@

回答 1 投票 0

GCC 10.2.1 上的“多重定义”“首先在此处定义”,但 GCC 8.3.0 上没有

我浏览了 Stackoverflow 和更广泛的互联网,发现导致此错误的最常见原因是声明 (int var = 1;) 和定义 (int var;) 的合并...

回答 2 投票 0

如何让编译器发出有关 switch 和 case 中枚举类型不匹配的警告?

对于下面的代码,我希望有一个警告,因为a是枚举A类型,但是case B1和B2是枚举B类型;但我找不到一种方法让 gcc/clang 发出警告。 关于如何做的任何建议

回答 1 投票 0

C语言中声明指针和数组有区别吗?

我正在将旧的视频游戏模拟器移植到 Arduino MCU 环境。与此同时,我对 C 代码进行了大量重构,因为它需要一些清理和简化。 使用 C 语言...

回答 1 投票 0

编译期间使用的标志

我正在编译巨大的C代码库,并且我们正在使用Make构建系统来自动化构建过程。基本上我们使用了很多标志,这些标志分散在多个 make 文件和那些编译器 fl...

回答 1 投票 0

Gcc 编译“无法计算目标文件的后缀:无法编译”

我实际上正在阅读LFS书(版本7.1),并且在第53页被阻止。尝试编译gcc,我尝试了以下命令: ./configure --target=$LFS_TGT --prefix=$LFS/build/gcc-build --disa...

回答 6 投票 0

链接描述文件中自定义 .rawdata 部分的数据完整性问题

我正在使用 ARM Cortex-M4 处理器(特别是 STM32F4 微控制器)开发一个嵌入式项目,并且遇到了与链接器中定义的内存部分相关的特殊问题...

回答 1 投票 0

为什么这个运算符重载可以在 MSVC 和 GCC 中编译,但不能在 Clang 中编译?

我正在尝试创建一个strong_alias包装类型,它可以与原始类型互换,但不能与其他strong_alias互换。 #包括 #包括 模板 我正在尝试创建一个 strong_alias 包装类型,它可以与原始类型互换,但不能与其他 strong_aliases 互换。 #include <array> #include <stdint.h> template <typename T, typename tag> requires std::is_arithmetic<T>::value class strong_alias { public: using type = T; constexpr strong_alias() : _value{} { } template <typename other> requires std::is_arithmetic<other>::value constexpr strong_alias(const other &set_value) : _value{T(set_value)} { } constexpr T &value() { return _value; } constexpr const T &value() const { return _value; } template <typename other> requires std::is_arithmetic<other>::value constexpr operator other() const { return other(value()); } constexpr bool operator==(const strong_alias &rhs) const { return value() == rhs.value(); } constexpr strong_alias operator*(const strong_alias &rhs) const { return value() * rhs.value(); } private: T _value; }; using A = strong_alias<int8_t, struct A_tag>; static_assert(std::is_assignable<A, A>()); static_assert(std::is_assignable<A, int>()); static_assert(std::is_assignable<int &, A>()); using B = strong_alias<int8_t, struct B_tag>; static_assert(not std::is_assignable<A, B>()); static_assert(not std::is_assignable<B, A>()); static_assert(A(-3) == A(3) * -1); // builds with MSVC and GCC but not Clang int main() { } 上面的代码可以使用 MSVC (/std:c++latest) 和 GCC (-std=c++2c) 进行编译,但不能使用 Clang (-std=c++2c) 进行编译。 这里有编译器资源管理器演示。 哪些编译器能够正确处理这段代码?在 Clang 下使其工作的首选方法是什么? Compiler Explorer 的 Clang 输出: <source>:61:29: error: use of overloaded operator '*' is ambiguous (with operand types 'A' (aka 'strong_alias<signed char, A_tag>') and 'int') 61 | static_assert(A(-3) == A(3) * -1); // builds with MSVC and GCC but not Clang | ~~~~ ^ ~~ <source>:43:25: note: candidate function 43 | constexpr strong_alias operator*(const strong_alias &rhs) const | ^ <source>:61:29: note: built-in candidate operator*(float, int) 61 | static_assert(A(-3) == A(3) * -1); // builds with MSVC and GCC but not Clang | ^ <source>:61:29: note: built-in candidate operator*(double, int) <source>:61:29: note: built-in candidate operator*(long double, int) <source>:61:29: note: built-in candidate operator*(int, int) [...many lines omitted...] <source>:61:29: note: built-in candidate operator*(unsigned long long, unsigned long) <source>:61:29: note: built-in candidate operator*(unsigned long long, unsigned long long) <source>:61:29: note: built-in candidate operator*(unsigned long long, unsigned __int128) 1 error generated. Compiler returned: 1 首先,我们应该在重现问题的同时尽可能地简化代码。令人失望的是,OP 似乎没有做出任何尝试这样做。这是最小化版本: #include <type_traits> struct A { A(int set_value) : _value{set_value} { } template <typename other> requires std::is_arithmetic<other>::value operator other() const { return other(_value); } A operator*(const A &rhs) const { return _value * rhs._value; } int _value = 0; }; int main() { (void)(A(3) * -1); } 现在,这个*可以有几种不同的解释方式。它可以是 A::operator*,可通过第二个操作数从 int 到 A 的隐式转换来调用,也可以是内置算术 operator*,可通过第一个操作数的隐式转换来调用操作数从 A 到算术类型(可能第二个操作数也经历到不同算术类型的隐式转换)。 Clang 可以帮助打印出所有候选人。 之所以不明确,是因为当调用operator*时,我们得到了与第一个参数类型的精确匹配以及与第二个参数类型的用户定义转换。当调用内置的 operator*(int, int) 时,我们得到一个用户定义的转换,其第一个参数类型与第二个参数类型完全匹配。所以这两个候选人都不比另一个更好。 叮当是正确的。至于如何编译原始代码,由于问题是由两个候选代码引起的,每个候选代码都可以通过不同的隐式转换实现,因此您的选择基本上是: 提供比所有当前现有候选更好的您自己的重载,例如,一个 operator*,其第一个参数类型为 const strong_alias&,第二个参数类型为算术类型,或者 将 A 的转换构造函数更改为显式,或者 将转换函数 (A::operator other) 更改为显式,或者 以上任意组合 我无法告诉您哪个选项最适合您。这取决于您希望您的类型提供的 API。 GCC 和 MSVC 之所以不认为它含糊不清,可能与他们使用不同的算法来确定哪些内置运算符是候选者有关。在这种特殊情况下,他们只是给出了错误的答案,但更普遍的是,该标准没有就如何在其他可能涉及无限的初始候选者的情况下缩小一组相关内置候选者的范围提供足够的指导。请参阅CWG2844。

回答 1 投票 0

clang(和 LLVM)和 gcc / g++ 有什么区别?

gcc 和 g++ 是 C 和 C++ 代码的传统 GNU 编译器。最近,使用 LLVM 的 clang(和 clang++)作为替代编译器越来越受欢迎。 CLASS 和 CLASS 有什么区别

回答 1 投票 0

如何为类模板的成员函数定义显式特化?

我需要将类模板 X 的成员函数专门化为某种类型(假设为 double)。 虽然类 X 本身不是类模板,但它工作得很好,但是当我将其设为模板时,GCC 开始给出...

回答 3 投票 0

为什么这个 gcc 学究会忽略扩展名?

gcc 警告选项文档说 -pedantic 选项应该对严格 ISO C 之外的禁止扩展发出警告。 但是,当我用我的 gcc 版本编译以下代码时...

回答 1 投票 0

NRVO 与未受益于移动语义的类型的提前返回(GCC 14 -Wnrvo)

GCC 14 引入了一个新的 -Wnrvo 标志: 新的 -Wnrvo 警告,如果未执行指定返回值优化,则发出警告,尽管 [class.copy.elision] 允许这样做。请参阅手册了解更多信息...

回答 1 投票 0

将多库项目静态链接到 libstd++?

我们正在构建一个由 2 个共享库 libProduct 和 libHelper 组成的项目。 libProduct 依赖于 libHelper。我们正在使用一个相当新的 GCC 工具链 (12) 来构建 Linux,以便提高...

回答 1 投票 0

gcc源码中cfg_hooks的函数指针所指向的函数体在哪里可以找到?

在 gcc cfghooks.cc 中 空白 Predict_edge(边 e,枚举 br_predictor 预测器,int 概率) { if (!cfg_hooks->predict_edge) 内部错误(“%s不支持predict_edge”,

回答 1 投票 0

ARM Cortex-M4 上链接描述文件中自定义 .rawdata 部分的数据完整性问题

我正在使用 ARM Cortex-M4 处理器(特别是 STM32F4 微控制器)开发一个嵌入式项目,并且遇到了与链接器中定义的内存部分相关的特殊问题...

回答 1 投票 0

使用带有依赖项生成的预编译头

人: 我正在尝试将预编译头与依赖项生成(-MM)结合起来。最终目标是生成make的依赖文件。无法将它们与 -fpch-deps 组合在一起。动机...

回答 1 投票 0

应用程序名称:/lib/libc.so.6:找不到版本“GLIBC_2.8”(应用程序名称需要)

命令的输出:ldd -v appname: linux-gate.so.1 => (0x00949000) libpthread.so.0 => /lib/libpthread.so.0 (0x00cea000) libm.so.6 => /lib/libm.so.6 (0x00a83000) libstdc++.so.6 => ...

回答 2 投票 0

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