标签: gcc-warning

这个编译器警告是什么意思?“在不同的地址有文本段”

我正在运行 Lion 的 Mac 上交叉编译一个项目,使用 GCC 作为 ARM 目标。我正在使用预编译标头,并且针对针对我的 PCH 进行编译的每个对象都会收到此警告:

cc1plus:警告:/yada/yada/yada_afx.hpp.gch:在不同地址有文本段[默认启用]

它似乎并没有阻止程序运行,但我担心它可能会导致或导致性能问题。该警告是什么意思?我应该担心吗?

顺便说一句,这是 cmake 编译所使用的命令的示例(删除了一些长路径):

/opt/local/bin/arm-linux-uclibc-g++ -DBOOST_PARAMETER_MAX_ARITY=16 \
-DBOOST_MPL_LIMIT_STRING_SIZE=80 -Wno-multichar -g -I/lots/of/include/dirs \
-include yada_afx.hpp -Winvalid-pch -o MySource.cpp.o -c MySource.cpp
Run Code Online (Sandbox Code Playgroud)

cross-compiling precompiled-headers compiler-warnings gcc-warning

5
推荐指数
0
解决办法
1347
查看次数

使“警告:数组‘foo’假定有一个元素”成为错误

我不小心通过写入声明了一个没有长度的数组enum foo bar[];,gcc 给了我警告“ array 'bar' assumed to have one element”。

有没有办法让 gcc 将其变成错误,而不是仅仅警告我并假设我的意思enum foo bar[1]?我想不出在什么情况下我会故意省略数组的长度。

c arrays gcc gcc-warning

5
推荐指数
1
解决办法
4983
查看次数

将“const char *”传递给“char *”类型的参数会丢弃限定符

我收到警告:

miniunz.c:342:25:将“const char *”传递给“char *”类型的参数会丢弃限定符

在Zip Archive 库的 miniunz.c 文件中。具体来说:

const char* write_filename;
fopen(write_filename,"wb"); //// This work fine...........
makedir(write_filename);    //// This line shows warning....
Run Code Online (Sandbox Code Playgroud)

应该如何删除这个警告以便两者都能正常工作?

c c++ objective-c gcc-warning

5
推荐指数
1
解决办法
2万
查看次数

为什么 GCC 的诊断编译指示对于某些警告类型失败?

我注意到 GCC 的诊断编译指示仅支持一些警告。

这有效:

#pragma GCC diagnostic error "-Wconversion"
Run Code Online (Sandbox Code Playgroud)

这失败了:

#pragma GCC diagnostic error "-Wframe-larger-than=32"
Run Code Online (Sandbox Code Playgroud)

...出现错误:

error: unknown option after '#pragma GCC diagnostic' kind [-Werror=pragmas]
#pragma GCC diagnostic error "-Wframe-larger-than"
Run Code Online (Sandbox Code Playgroud)

..当作为命令行参数传递时,这两个参数都可以与 GCC 一起使用。


是否有编译指示支持警告的任何文档GCC diagnostic

c pragma gcc-warning

5
推荐指数
2
解决办法
8786
查看次数

将 void * 值设置为 intptr_t 变量是否需要显式转换?

我似乎无法理解当我尝试为变量void *赋值时收到的 GCC 编译器警告intptr_t。具体来说,当我使用 进行编译时-std=c99 -pedantic,我收到以下有关z第 7 行变量初始化的警告:

警告:初始化从指针生成整数而不进行强制转换 [-Wint-conversion]

这是源代码:

#include <stdint.h>

int main(void){
        unsigned int x = 42;
        void *y = &x;

        intptr_t z = y; /* warning: initialization makes integer from pointer without a cast [-Wint-conversion] */

        return 0;
}
Run Code Online (Sandbox Code Playgroud)

当然,如果我明确地转换y为,intptr_t那么警告就会消失。但是,我很困惑为什么隐式转换会出现警告,而隐式转换的全部目的intptr_t在于void *值的转换和操作。

来自C99 标准第 7.18.1.4节:

以下类型指定有符号整数类型,其属性为任何有效的void指针都可以转换为该类型,然后转换回void指针,结果将与原始指针进行比较:

intptr_t

我是否误解了标准,或者在这种情况下,GCC 在“指针中的整数”检查中是否过于迂腐?

c gcc pointers c99 gcc-warning

5
推荐指数
1
解决办法
1833
查看次数

“控制到达非 void 函数末尾” with do { return result; while(条件);

我有以下功能(简化示例):

QByteArray DecompressBytes(const QByteArray& content){
  /* function body (with other return expressions) */

  do { return content; } while(content.size() != 0);
}
Run Code Online (Sandbox Code Playgroud)

添加最后一行用于测试,替换使用的宏。Visual Studio 没有发现此代码有问题,但 g++ 生成

警告:控制到达非 void 函数的末尾 [-Wreturn-type]

更改最后一行以return content;删除警告。
我的问题:为什么编译器会这样做?代码的形式应该是什么以避免任何警告?

最后一行过去是扩展为ASSERT_FAIL("must be unreachable", content)模式,并用另一个宏替换以禁止非布尔表达式,因此生成的表达式类似于. ASSERT_FAILdo { ... } while(false)whiledo { qt_assert_x("", "", 42); return content; } while(::helper::bool_verify(false));

g++ 版本 5.3.0,与 MinGW(标准 Qt 设置)一起使用。

更新:在尝试注释代码的不同部分之后(因为上面的纯示例不允许重现问题),出现了一些非常奇怪的情况:

QByteArray DecompressBytes(const QByteArray& content){
  QByteArray decompressed; //no 'unused variable' warning
  do { return content; …
Run Code Online (Sandbox Code Playgroud)

c++ gcc gcc-warning

5
推荐指数
1
解决办法
613
查看次数

GCC 编译器选项 -wno-four-char-constants 和 -wno-multichar

找不到有关 的任何文档-Wno-four-char-constants,但我怀疑它与-Wno-multichar. 我对么?

gcc clang compiler-warnings gcc-warning

5
推荐指数
1
解决办法
2044
查看次数

如何修复结构填充的 C++ gcc 编译警告

我有以下看起来无害的代码:

void myFunc(){
    struct stance {
        long double interval;
        QString name;
    };
    // [...]
}
Run Code Online (Sandbox Code Playgroud)

当我在 Ubuntu 18.04 上使用标准版本的 gcc 构建它时,我收到如下警告:

MySource.cpp:12:警告:用 8 个字节填充“立场”的大小到对齐边界(-wpadded)

我知道出现此警告是因为编译器需要将我的结构的填充调整为我可能没有预料到的内容,并且很友善地警告我作为用户这一点。

但是,我试图进行无警告构建,因此问题是,如何以符合标准的方式在代码中明确显示编译器不需要发出此警告?

因此,需要明确的是,我不想在构建脚本中抑制警告,也不想使用 #pragma 或类似的内容。我想更改此结构的代码,以便我的对齐期望是明确的并匹配编译器想要执行的任何操作,因此不需要显示警告。

c++ compiler-warnings suppress-warnings gcc-warning

5
推荐指数
1
解决办法
7478
查看次数

如何获得算术中忘记转换的警告?

考虑这种情况:

uint64_t add(uint32_t a, uint32_t b)
{
   return a + b; // programmer neglected (uint64_t) a + b.
}
Run Code Online (Sandbox Code Playgroud)

我们如何让 GCC(或任何其他编译器)的 C 或 C++ 前端对这种情况发出警告:正在以立即变宽的窄类型完成操作?

我已经通读了当前的 GCC 文档,并尝试了各种警告,例如-Wconversion,但没有任何结果。

c c++ gcc-warning

5
推荐指数
1
解决办法
571
查看次数

Fortran 分配(重新)分配和 gfortran 警告

一个简单的代码:

\n\n
program main\ninteger, allocatable :: A(:,:)\ninteger              :: B(3,4)\nB=1\nA = B  !A will get allocated, with the same shape and bounds as B\nend program main\n
Run Code Online (Sandbox Code Playgroud)\n\n

编译上面的代码:gfortran-8 -std=f2008 -fcheck=all -Wall -Wextra -fbounds-check -fimplicit-none array.f90

\n\n

我收到以下警告:

\n\n

Warning: \xe2\x80\x98a.offset\xe2\x80\x99 may be used uninitialized in this function\nWarning: \xe2\x80\x98a.dim[0].lbound\xe2\x80\x99 may be used uninitialized in this function \nWarning: \xe2\x80\x98a.dim[0].ubound\xe2\x80\x99 may be used uninitialized in this function [-Wmaybe-uninitialized]

\n\n

有人知道我为什么收到这些警告吗?

\n

fortran gfortran compiler-warnings gcc-warning allocatable-array

5
推荐指数
1
解决办法
842
查看次数