gcc 相关问题

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

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

std::println/print 在 Winlibs MinGW 中不起作用(gcc 14.1)

我正在 GCC 14.1 中测试新的 库,并尝试使用 std::println() 编译一个程序,结果却收到了这个消息(为了隐私,我已从 Users 目录中删除了我的名字...

回答 1 投票 0

使用 gcc 13.1.0 在独立环境中运行测试覆盖率

全部 我正在尝试在 Ubuntu 20.04 上遵循 gcov tuturial 我将 gcc 更新为 gcc 13.1.0 sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt install gcc-13 然后我尝试构建...

回答 1 投票 0

std::println/print 在 gcc 14.1 中不起作用

我正在 GCC 14.1 中测试新的 库,并尝试使用 std::println() 编译一个程序,结果却收到了这个消息(为了隐私,我已从 Users 目录中删除了我的名字...

回答 1 投票 0

C++ 编译器错误:术语“make”未被识别为 cmdlet 的名称

我想在 vscode 中编译 cpp 项目,然后我在终端中写入“make 后出现错误:在此处输入图像描述,您对此错误有何看法。我如何解决这个问题? 我无法联系...

回答 1 投票 0

collect2:致命错误:找不到‘ld’编译终止。 ,已安装 binutils

我一直致力于生成共享库,在安装linpack时我不小心替换了 cp linpack-fpm/lib/liblinpack.a /usr/bin/ld ,我尝试参考各种解决方案,例如...

回答 1 投票 0

在使用 GNU 编译器进行编译期间更改 Linux 中 C++ 应用程序的堆栈大小

在 OSX 中,在使用 g++ 编译 C++ 程序期间,我使用 LD_FLAGS= -Wl,-stack_size,0x100000000 但在 SUSE Linux 中我经常遇到如下错误: x86_64-suse-linux/bin/ld:无法识别的选项“--stack”...

回答 5 投票 0

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