在测试中,我丢弃了任何东西,stderr因为它使测试用例的输出变得混乱.我正在使用以下代码:
freopen("/dev/null", "w", stderr);
Run Code Online (Sandbox Code Playgroud)
编译时-Wall -Werror,我得到错误
error: ignoring return value of ‘freopen’, declared with attribute warn_unused_result
Run Code Online (Sandbox Code Playgroud)
这是预料之中的.但是,通常的铸造解决方案void似乎不起作用.也就是说,将代码更改为
(void) freopen("/dev/null", "w", stderr);
Run Code Online (Sandbox Code Playgroud)
仍然会产生相同的警告.我不在乎这个函数是否失败,因为最坏的情况是一些额外的输出.我可以解决这个问题吗?
编辑:我知道我可以引入一个额外的不必要的变量.我真的很想知道为什么无法转换为无效.
更新: 我决定采用这个:
FILE *null = fopen("/dev/null", "w");
if (null) { fclose(stderr); stderr = null; }
Run Code Online (Sandbox Code Playgroud)
在freopen仔细阅读文档之后,我看到如果打开/dev/null失败,stderr仍然会被销毁.这解决了这个问题.
在gcc4.4.5中,我发出以下代码的警告.
char *f(void)
{
char c;
return &c;
}
Run Code Online (Sandbox Code Playgroud)
但是,当我使用临时指针时,不再有警告(即使行为是错误的).
char *f(void)
{
char c;
char *p = &c;
return p;
}
Run Code Online (Sandbox Code Playgroud)
我听说在C中指针分析很困难,但可以gcc警告这样的代码吗?
当我比较一个std::abs(int)和一个时,我正在收到有关签名与无签名比较的警告unsigned.事实上,std::abs返回签署的值.为什么选择这个?它将解决负值的问题,其绝对值不能用有符号的类型表示.
然后,是否有比这更清洁(即没有演员表)的东西以避免警告?
#include <cassert>
#include <cstdlib>
// max(1, lhs + rhs). (lhs must be > 0)
unsigned add(unsigned lhs, int rhs)
{
return
(0 < rhs || static_cast<unsigned>(-rhs) < lhs
? rhs + lhs
: 1);
}
int main()
{
assert(add(42, -41) == 1);
assert(add(42, 0) == 43);
assert(add(42, 1) == 43);
assert(add(42, -51) == 1);
}
Run Code Online (Sandbox Code Playgroud) 当我编译我的库时,我已经开启了,-fPIC因为我希望能够将其编译为共享库,但也可以作为静态编译.
在cygwin上使用gcc 3.4.4我在所有源文件上收到此警告:
-fPIC ignored for target (all code is position independent)
Run Code Online (Sandbox Code Playgroud)
而且我真的很想知道它有什么意义.它告诉我,我使用的开关没有效果,因为开关应该已经完成了.嗯,这意味着它是多余的,很好.但它有什么意义呢?我该如何压制它呢?
我不是在谈论为什么使用PIC,而是为什么它会产生IMO无用的警告.
我最近在下一个类似的上下文中遇到了一个错误:
double getSomeValue()
{
return 4.0;
}
...
std::string str;
str = getSomeValue();
Run Code Online (Sandbox Code Playgroud)
正如您在这里看到的那样很容易发现问题,但是在一个大型代码库中getSomeValue(),调用代码不在同一个文件中,可能很难发现这double是std::string静默转换.GCC编译这段代码很好-Wall -Wextra -Werror(这里的示例输出,我不知道使用了什么警告标志:http://ideone.com/BTXBFk).
我如何强制GCC为这些危险的隐式转换发出警告?我试过了-Wconversion,但它非常严格,它会导致大多数包含标题的错误,例如unsigned - 1.是否有较弱的版本-Wconversion?
编译以下代码
template <typename X, typename F>
auto apply(X x, F f)
{
return f(x);
}
template <typename Y>
auto add_value(Y y)
{
return [y](auto x)
{
return x + y;
};
}
int main()
{
apply(1, add_value(2));
}
Run Code Online (Sandbox Code Playgroud)
用g ++(egv 5.4)给出阴影警告.
$ g++ -Wshadow -Werror -std=c++14 shadow_test.cpp
shadow_test.cpp: In instantiation of ‘add_value(Y)::<lambda(auto:1)> [with auto:1 = int; Y = int]’:
shadow_test.cpp:4:13: required from ‘auto apply(X, F) [with X = int; F = add_value(Y) [with Y = int]::<lambda(auto:1)>]’
shadow_test.cpp:18:26: required …Run Code Online (Sandbox Code Playgroud) 我正在GCC编译器版本7.1.0上测试C++ 17的功能.这与fallthrough属性有关,以下示例(实例)在此处改编自在线CPP参考
#include "iostream"
using namespace std;
int f(int n) {
switch (n) {
case 1:
case 2:
n = n + 20;
[[fallthrough]];
case 3: // no warning on fallthrough
n = n + 30;
case 4: // compiler may warn on fallthrough
[[fallthrough]]; // illformed, not before a case label
//n = n + 40; //commented out to test if compiler will warn.
}
return n;
}
int main()
{
cout << …Run Code Online (Sandbox Code Playgroud) 使用以下命令
gcc -c -Wall -Wextra -pedantic -ansi -std=c99 -fstack-protector-all -fstack-check -O3 root.c -o rootTESTOBJECT
Run Code Online (Sandbox Code Playgroud)
我得到编译器警告root.h:76:22:警告:ISO C不允许命名的可变参数宏
72 #ifdef Debug
73 #include <stdio.h>
74 #define crumb(phrase0...) printf(phrase0)
75 #else
76 #define crumb(phrase0...)
77 #endif
Run Code Online (Sandbox Code Playgroud)
我相信选项-ansi -std = c99允许使用可变参数宏,无论如何它根据文档...
我已经尝试编辑76行了
76 #define crumb(phrase0...) printf("")
Run Code Online (Sandbox Code Playgroud)
看看这是否修复了警告,但没有任何乐趣.
编译器版本是Apple的gcc,版本4.2.1我不确定我是否需要过于担心,但我真的不喜欢警告.我错过了什么旗帜?
我知道gcc有一个选项-Wcast-align,只要指针被转换就会发出警告,以便增加目标所需的对齐.
这是我的计划:
char data[10];
int ptr = *((int *)data);
Run Code Online (Sandbox Code Playgroud)
在我的机器上,数据的对齐要求是1,而ptr是8.
为什么我没有收到警告?
可能是因为我正在为x86编译吗?
我正在尝试在 ubuntu 上编译 mitk,但出现此错误:
错误:此语句可能会失败 [-Werror=implicit-fallthrough=]
这里有一部分代码:
/** Get memory offset for a given image index */
unsigned int GetOffset(const IndexType & idx) const
{
const unsigned int * imageDims = m_ImageDataItem->m_Dimensions;
unsigned int offset = 0;
switch(VDimension)
{
case 4:
offset = offset + idx[3]*imageDims[0]*imageDims[1]*imageDims[2];
case 3:
offset = offset + idx[2]*imageDims[0]*imageDims[1];
case 2:
offset = offset + idx[0] + idx[1]*imageDims[0];
break;
}
return offset;
}
Run Code Online (Sandbox Code Playgroud)
请提供任何帮助,我将不胜感激。