Tag: gcc warning

-fPIC忽略目标(所有代码都与位置无关),无用的警告

当我编译我的库时,我已经切换了-fPIC因为我希望能够将其编译为共享库,但也可以作为静态编译。 在cygwin上使用gcc 3.4.4我在所有源文件上收到此警告: -fPIC ignored for target (all code is position independent) 我真的很想知道它有什么意义。 它告诉我,我使用的开关没有效果,因为开关应该已经完成​​了。 嗯,这意味着它是多余的,很好。 但它有什么意义呢?我该如何压制它呢? 我不是在谈论为什么使用PIC,而是为什么它会产生IMO无用的警告。

什么原因导致编译器警告未使用的函数?

简单设置:有n个函数的原型和函数的实现。 有一大堆函数指针。 每个函数都列在此数组中。 在使用gcc进行编译时,有些仍会导致-Wunused-function。 码: void foo1(void); void foo2(void); void bar1(void); void bar2(void); /* and their implementations */ void (*functions[])(void) = { foo1, foo2, bar1, bar2 }; 这就是设置的样子(仅举例)! 其中一个foo / bar函数现在在使用gcc编译时会导致-Wunused-function警告。 其他人没有。 为什么?

如何定义外部变量和声明?

维基说: extern关键字表示“声明而不定义”。 换句话说,它是一种显式声明变量或强制声明而无需定义的方法。 也可以明确定义变量,即强制定义。 这是通过为变量分配初始化值来完成的 。 这意味着, 初始化变量的extern声明用作该变量的定义 。 所以, /* Just for testing purpose only */ #include extern int y = 0; int main(){ printf(“%d\n”, y); return 0; } 应该是有效的( 在C ++ 11中编译 )。 但是当在GCC 4.7.2中使用选项-Wall -Wextra -pedantic -std=c99进行编译时,会产生一个警告: [Warning] ‘y’ initialized and declared ‘extern’ [enabled by default] 哪个不应该。 据我所知, extern int y = […]

“警告:假设循环不是无限”的解释是什么?

我刚刚决定将unsigned变量更改为int并在重新编译有问题的代码时受到此警告消息的欢迎: freespace_state.c:203: warning: assuming that the loop is not infinite 有问题的一行: for (x = startx; x <= endx; ++x, ++xptr) 这个循环是60行代码(包括空格/括号等),并且在其中有一个goto ,并且至少出现一次continue 。 在这种情况下,我认为我很欣赏GCC假设这个循环不是无限的,因为它永远不应该无限循环。 GCC试图在这里告诉我什么? 警告的语法几乎暗示警告应该在其他警告的范围内进行,但在该背景下没有警告。 [编辑]这完全是我自己的错。 我从这里的一个问题偷了一些优化和警告选项而没有真正了解它们,并且忘记了它们。 请参阅Mark Rushakoff的回答,此外,我还使用-Wunsafe-loop-optimizations来明确警告GCC是否对循环做出假设。 请参阅http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

告诉gcc函数调用不会返回

我在GCC下使用C99 。 我有一个函数在头文件中声明为static inline ,我无法修改。 函数永远不会返回,但未标记为__attribute__((noreturn)) 。 如何以告诉编译器不会返回的方式调用该函数? 我从我自己的noreturn函数调用它,部分想要抑制“noreturn函数返回”警告但也想帮助优化器等。 我已尝试在属性中包含声明,但会收到有关重复声明的警告。 我已经尝试创建一个函数指针并将该属性应用于该函数,但它表示函数属性不能应用于指向函数。

让编译器检查数组初始值设定项的数量

初始化一个数组(在C ++中,但任何适用于C的解决方案也可能在这里工作)使用较少的初始化器而不是元素是完全合法的: int array[10] = { 1, 2, 3 }; 但是,这可能是一些模糊的错误。 有没有办法让编译器(gcc)检查一个特定数组的初始值设定项的数量,如果声明和实际大小不匹配,则发出警告甚至错误? 我知道我可以使用int array[] = { 1, 2, 3 }; 然后可以使用涉及sizeof(array)静态断言来validation我的期望。 但我在其他翻译单元中使用array ,所以我必须用明确的大小声明它。 所以这个技巧对我不起作用。

如何解决:在C代码中“从不同大小的整数转换为指针”警告?

我正在从遗留代码中删除gcc警告。 是否可以通过类型转换抑制警告“从不同大小的整数转换为指针”: example: some_struct *ptr = func() // func() returns an integer. 有人可以指导我如何解决这样的gcc警告吗?

如何禁用gcc警告“cc1:warning:命令行选项’-std = c ++ 11’对C ++ / ObjC ++有效,但对C无效”

我是cmake和gcc的新手。 我在公司的新角色中的第一个任务是清除我的linux编译中的大部分错误,现在我看到的唯一警告是 cc1: warning: command line option ‘-std=c++11’ is valid for C++/ObjC++ but not for C [enabled by default] 我希望枯萎抑制警告或解决cmake文件中的问题。 不幸的是,我仍然没有找到适合这里的正确-Wno-xxx语句。 谢谢!

函数声明为static但从未定义过

我有一个头文件假设abc.h,其中我有函数声明为: static int function1(); 我已将此头文件包含在abc.c中并定义了该函数并使用了它。 static int function1() { } 编译后我收到警告: warning: function1 declared static but never defined 如何在不删除静电的情况下删除警告。 谢谢。

存储类和类型的奇怪GCC警告

我有一个看起来像的头文件 header.h int TOS; 该文件仅包含在一个代码文件中 code.c #include “header.h” TOS=0; 编译code.c时,GCC会发出警告 code.c:3:1:警告:数据定义没有类型或存储类[默认启用] code.c:3:1:警告:在’TOS’声明中默认为’int’类型[默认启用] 我不明白这个警告的原因。 它不等同于在code.c中声明和定义TOS吗? 即 code.c int TOS; TOS=0;