GCC ARM 中的 C++ 构建警告,但不是 MS x86

     2023-03-13     24

关键词:

【中文标题】GCC ARM 中的 C++ 构建警告,但不是 MS x86【英文标题】:C++ Build warning in GCC ARM but not MS x86 【发布时间】:2011-02-12 12:22:16 【问题描述】:

我使用 Airplay SDK,它是一个为智能手机构建 C++ 应用程序的平台。它还有一个使用 MS Visual C++ IDE + 编译器的 x86 模拟器。

现在,我有这门课了:

namespace Fair 

    class Bitmap : public Sprite 

    public:

        const CIw2DImage* const& getBitmapData()  return bitmapData; ; // warning: returning reference to temporary

    private:

        CIw2DImage* bitmapData;
    ;


如果我使用 GCC (ARM) Debug 构建,我会收到上述警告。我没有收到 (x86) Debug 的警告。

我在其他地方问过,我得到了这个答复:

因为 `const CIw2DImage* const' 是一个 指向 const CIw2DImage 的 const 指针,以及 Bitmap::bitmapData 是指向 非常量 CIw2DImage 编译器 自动将指针转换为 非 const 到 const,所以这里有一个 暂时的。以下代码可能是 由“典型”编译器生成:

const CIw2DImage* const& getBitmapData() 
    const CIw2DImage* const tmp = bitmapData;
    return tmp;

可能 (x86) 编译器没有检测到 这个问题。

您可能想要删除参考 原型中的符号 (&)(为什么 您想在此使用参考 案例?)

如果编译器这样做,那么这是完全错误的做法..?使返回的值更“严格”只是在编译器级别,以防止“滥用”。 (x86) 没有检测到,因为它在第一种情况下不会“导致”问题..?

我返回一个指针的引用是为了“保存” 32 位内存,即使用与 bitmapData 指针相同的内存块,但在不同的上下文中。

请问有cmets吗?

【问题讨论】:

回复:“我返回对指针的引用只是为了“保存”32 位内存”——引用(几乎可以肯定)与指针大小相同。按值传递简单类型通常更有效。 当你传递一个对指针的常量引用时,你实际上不是传递了指针本身吗?即不再为 YAP 保留内存(又一个指针)。 不,按引用传递。即使引用的是一个常量对象,也可以使用const_cast来改变对象,所以需要间接引用。 【参考方案1】:

编译器这样做是非常正确的。引用必须引用正确类型的对象;这里你有一个CIw2DImage* 类型的对象,你需要一个不同类型的引用,const CIw2DImage*。做到这一点的唯一方法是创建一个正确类型的临时变量(这在此处是可能的,因为 const T* 可以隐式转换为 T*),并返回对它的引用。

不幸的是,这会导致对函数范围内的临时对象的引用,一旦函数返回,该对象就不再有效。

最简单的解决方案是按值返回指针;这将更有效(因为它避免了不必要的间接级别),并且避免了这个问题。

【讨论】:

我还是不明白。返回值为 const CIw2DImage* CONST,它是 SAME 指针,但有附加限制,即根本无法更改。我仍然看不出为什么要复制它的原因。我不认为 MS x86 会愚蠢到在没有警告的情况下允许这样做,我怀疑它只是对其进行了优化(应该如此)。 @Bill: 不,返回类型是const CIw2DImage* const&,对指针的引用。尽管它是对 const 类型的引用,但 C++ 允许您使用 const_cast 来修改对象,因此它确实必须是引用。它不能是对类成员的引用,因为那是不同的类型。 MSVC 必须要么允许引用引用不兼容类型的对象(这是不符合标准的,但可能是无害的),或者默默地返回对临时对象的引用(这是令人讨厌的)。【参考方案2】:

您根本不会保存任何返回引用的内存,它只是一个内部指针。此外,const 完全发生在编译时,没有理由生成任何临时文件——即使是,对它的 const 引用也是有效的。

该代码对我个人来说看起来很糟糕,但它并没有以任何方式未定义。

【讨论】:

1) 它是另一个指针,还是原来的指针本身? 2)没有理由临时,我同意,所以这是一个 GCC 错误?错误生成的代码? "const 完全发生在编译时" - 不,T *T const * 是两种不同的类型,因此对一个的引用不能引用另一个。这就是为什么您需要一个正确类型的临时参考。 “对它的 const 引用将是有效的” - 仅在临时范围内。函数返回后无效。

gcc+mingw 下的 C++ segfault 但不是 gcc+linux

】gcc+mingw下的C++segfault但不是gcc+linux【英文标题】:C++segfaultundergcc+mingwbutnotgcc+linux【发布时间】:2014-08-3117:08:21【问题描述】:我在Mingw下的bigprogram中有一个错误,但在Linux下没有。我设法将其简化为以下代码:#include<iostream&g... 查看详情

由于 std::pair 导致的 GCC (MoSync) 中的 C++ 构建错误

】由于std::pair导致的GCC(MoSync)中的C++构建错误【英文标题】:C++builderrorinGCC(MoSync)duetostd::pair【发布时间】:2013-01-3116:35:53【问题描述】:我正在使用MoSyncIDE为移动平台构建我的C++代码。最初,C++代码是由VisualStudio2010单独构建的... 查看详情

如何从 gcc 内联 arm7 程序集中调用 c++ 成员函数

...c/arm7内联汇编。似乎替换堆栈只是将堆栈指针移动到r15而不是esp的简单问题,但我不知道如何调用该函数,或将实际变量放入手臂汇编代码。Object*c 查看详情

线程(c++ 中的并行计算)是不是与优化级别(gcc)不兼容?

】线程(c++中的并行计算)是不是与优化级别(gcc)不兼容?【英文标题】:Isthread(parallelcomputinginc++)incompatiblewithoptimizationlevels(gcc)?线程(c++中的并行计算)是否与优化级别(gcc)不兼容?【发布时间】:2015-08-1220:56:08【问题描... 查看详情

gcc 警告:已使用但未定义的函数

...有static__inline__说a.h。头文件包含在a.c中。我想将头文件中的所有内联函数放入.c文件中。以下代码给出了我的问题的想法。原始代码:啊哈:static__inli 查看详情

C++ 指针使用 Visual Studio 更改地址,而不是使用 OsX 中的 Xcode 或 Linux 中的 gcc

】C++指针使用VisualStudio更改地址,而不是使用OsX中的Xcode或Linux中的gcc【英文标题】:C++pointerchangesaddresswithVisualStudio,notwithXcodeinOsXorgccinLinux【发布时间】:2014-03-3022:32:19【问题描述】:我有一个C++问题困扰了我好几个小时:我有... 查看详情

C++ MFC 构建错误,但组件不是 MFC

】C++MFC构建错误,但组件不是MFC【英文标题】:C++MFCbuilderrorbutcomponentisNOTMFC【发布时间】:2011-02-0112:40:25【问题描述】:我不是C++开发人员,所以请对我温柔一点。我正在开发一个旧的c++解决方案,并且我添加了一个新的托管项... 查看详情

如何为 arm gcc 构建 mbedtls

】如何为armgcc构建mbedtls【英文标题】:Howtobuildmbedtlsforarmgcc【发布时间】:2021-07-1107:22:13【问题描述】:我想在我的stm32项目中使用mbedtls,但我在构建时遇到了一些问题。我必须用arm-none-gcc编译器构建mbedtls,对吗?我的命令是... 查看详情

如何在 gcc/clang 中的错误和警告之间添加换行符/边框

】如何在gcc/clang中的错误和警告之间添加换行符/边框【英文标题】:Howtoaddnewlines/bordersbetweenerrorsandwarningsingcc/clang【发布时间】:2019-10-1711:20:57【问题描述】:我知道这可能是一个菜鸟问题,但在查看构建输出时,我经常无法确... 查看详情

无法使用 gcc 构建 sigqueue 示例,但 g++ 可以吗?

】无法使用gcc构建sigqueue示例,但g++可以吗?【英文标题】:Can\'tbuildsigqueueexamplewithgccbutg++isok?【发布时间】:2010-09-2809:58:00【问题描述】:我有一个奇怪的构建问题。我有一个简单的测试程序,可以将sigqueue发送到另一个进程。... 查看详情

在源代码中部分禁用 gcc 中的迂腐警告

】在源代码中部分禁用gcc中的迂腐警告【英文标题】:Partiallydisablepedanticwarningsingccwithinsource【发布时间】:2013-01-1314:09:36【问题描述】:我试图让gcc闭嘴我对二进制常量的使用。它们使代码更具可读性,但阻止我使用-pedantic,... 查看详情

gcc 的奇怪行为。带有 和 = 的 C++ 对象定义是不是相等?

】gcc的奇怪行为。带有和=的C++对象定义是不是相等?【英文标题】:Strangebehaviorofgcc.AreC++objectdefinitionswithand=equalornot?gcc的奇怪行为。带有和=的C++对象定义是否相等?【发布时间】:2020-08-0810:25:17【问题描述】:我正在测试将Proc... 查看详情

Visual C++ 是不是提供与 GCC 中的 `__attribute__((alias))` 功能相同的语言结构?

】VisualC++是不是提供与GCC中的`__attribute__((alias))`功能相同的语言结构?【英文标题】:DoesVisualC++providealanguageconstructwiththesamefunctionalityas`__attribute__((alias))`inGCC?VisualC++是否提供与GCC中的`__attribute__((alias))`功能相同的语言结构?【... 查看详情

无情的 GCC C++ 编译器

】无情的GCCC++编译器【英文标题】:UnforgivingGCCC++compiler【发布时间】:2011-02-1718:05:04【问题描述】:MSVSx86编译器对以下定义没有问题,但GCC(ARM)抱怨。是GCC笨还是MSVS_x86太聪明了?boolcheckPointInside(constCIwVec2&globalPoint)returncheckPo... 查看详情

使用自定义构建的 gcc(g++) 构建 c++ 项目

】使用自定义构建的gcc(g++)构建c++项目【英文标题】:buildingac++projectwithcustomlybuiltgcc(g++)【发布时间】:2013-12-2014:25:31【问题描述】:我从源代码构建了gcc-4.8.2,配置了--prefix=.../destdir。我正在使用Ubuntu12.0464位。所以在我运行“ma... 查看详情

Matlab mex 无法构建,但 gcc 可以

...Matlab的新手,正在尝试构建一个C文件。使用gcc(64位Ubuntu中的4.8.4)可以很好地编译代码。但是当我尝试使用mex构建时,它显示以下错误:error:exponenthasnodigits我不确定我做错了什么。错误是inthisfile。完 查看详情

GCC 警告声明但未定义的变量

】GCC警告声明但未定义的变量【英文标题】:GCCwarnaboutdeclaredbutundefinedvariable【发布时间】:2016-01-0501:12:33【问题描述】:我从thesequestions知道,如果我在头文件中声明一个静态const变量:Foopublic:staticconstintBAR=1234;...;我还必须在源... 查看详情

在 ARM 上为 eCos 构建 C++ 应用程序

】在ARM上为eCos构建C++应用程序【英文标题】:BuildingC++applicationforeCosonARM【发布时间】:2013-08-2914:30:50【问题描述】:我希望在ARM处理器上为eCos构建C++应用程序。我的程序需要几个标准的C++头文件,例如vector、iostream、list、...我... 查看详情