请教gcc编译下的几个gcc 警告级别该怎么去除

关于GCC编译程序报出警告:note: neither the destructor nor the class-specific operator delete will be called...的问题及解决方案 - CSDN博客
在任意Linux系统,GCC 4.1.1或4.1.2环境下,建立以下工程:
test: test.o agg.o&&& g++ -o test test.o agg.o
agg.o: agg.cpp agg.h base.h&&& g++ -g -c -Wall -o agg.o agg.cpp
test.o: test.cpp agg.h base.h&&& g++ -g -c -Wall -o test.o test.cpp
#include "agg.h"
int main(int, char**){&&& CA&&& return 0;}
#include &stdio.h&
class CBase{public:&&& CBase() { printf("CBase/n"); }&&& ~CBase() { printf("~CBase/n"); }};
#include &memory&
class CAggretive{public:&&& CAggretive();&&& ~CAggretive() { printf("~CAggretive/n"); }private:&&& std::auto_ptr&CBase&&&& m_};
#include "agg.h"#include "base.h"
CAggretive::CAggretive()& : m_obj(new CBase()){&&& printf("CAggretive/n");};
编译后得到目标可执行文件test。编译时得到警告信息:
g++ -g -c -Wall -o test.o test.cpp/usr/lib/gcc/i386-redhat-linux/4.1.1/../../../../include/c++/4.1.1/memory: In destructor &std::auto_ptr&_Tp&::~auto_ptr() [with _Tp = CBase]&:agg.h:9:&& instantiated from here/usr/lib/gcc/i386-redhat-linux/4.1.1/../../../../include/c++/4.1.1/memory:259: warning: possible problem detected in invocation of delete operator:/usr/lib/gcc/i386-redhat-linux/4.1.1/../../../../include/c++/4.1.1/memory:259: warning: invalid use of undefined type &struct CBase&agg.h:3: warning: forward declaration of &struct CBase&/usr/lib/gcc/i386-redhat-linux/4.1.1/../../../../include/c++/4.1.1/memory:259: note: neither the destructor nor the class-specific operator delete will be called, even if they are declared when the class is defined.g++ -o test test.o agg.o运行可执行文件test,程序输出:
CBaseCAggretive~CAggretive可以发现CBase的析构函数没有被调用,在实际应用中将造成内存和资源泄漏。
这是因为编译test.cpp时,包含文件树中没有base.h,所以编译器在实体化auto_ptr&CBase&类时不知道如何执行delete CBase型数据结构的方法。
在test.cpp最开头加上一句#include "base.h"即可解决此问题。编译agg.cpp时没有给出警告便是此原因。
(那么,为什么编译器知道如何new CBase型数据结构呢?那是因为CAggretive的构造函数是写在agg.cpp中,因此它的实现在agg.o中已经编译进去了)
因为像agg.h这样前置声明CBase,然后在类成员中使用它是一种不好的习惯,任何没有包含base.h而直接使用agg.h的cpp文件在编译时都会产生泄漏。
实际应用中可能会出现比本例更为复杂的引用情况,修改方式可能不那么简单。但总体思路是一样的,即是让编译器在编译此文件时确实包含用作auto_ptr的模板参数的类。编译器(12)
你可以使用'-W'开始的选项来请求许多特定的警告,例如-Wimplicit要求对隐式声明发出警告。所有这些特定的警告选项也有一个以“-Wno-“开头的否定形式来关闭警告;例如︰-Wno-explicit。
You can request many specific warnings with options beginning with ‘-W’, for example -Wimplicit to request warnings on implicit declarations. Each of these specific warning options also has a negative form beginning ‘-Wno-’
for example,
-Wno-implicit. This manual lists only one of the two forms, whichever is not the default. For further language-specific options also refer to C++ Dialect Options and Objective-C and Objective-C++ Dialect Options. &
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:482499次
积分:10360
积分:10360
排名:第769名
原创:340篇
转载:846篇
译文:107篇
评论:31条
(11)(27)(1)(6)(32)(57)(29)(8)(3)(37)(89)(109)(51)(165)(92)(105)(220)(171)(34)(6)(19)(4)(1)(8)(6)(1)(1)15869人阅读
Linux相关(53)
C语言(45)
1、warning: no newline at end of file
在文件最后一行加上回车键
解释:在《Rationale for the C99 standard》一文中,有C99的相关信息:
A backslash immediately before a newline has long been used to continue string literals, as well as preprocessing command lines. In the interest of easing machine generation
of C, and of transporting code to machines with restrictive physical line lengths, the C89 Committee generalized this mechanism to permit any token to be continued by interposing a backslash/newline sequence.
c/c++代码的每一行后面有一个“结束符”,也就是newline。避免当被include的文件展开后,前一个文件的最后一行与后一个文件的第一行直接被连接成一行从而造成错误。
2、warning: comparison between pointer and integer
解释:integer与pointer比较
3、&warning: assignment discards qualifiers from pointer target type
解释:赋值时,取消了右值的限定。
4、&warning: passing argument 1 of 'send' makes pointer from integer without a cast
解释:函数send的第一个integer型参数没有强制转换为pointer型
5、warning: comparison is always true due to limited range of data type
解释:由于数据类型范围的限制,比较结果一直为真。
6、warning: initialization from incompatible pointer type
解释:不兼容指针类型的初始化
7、&warning: return makes pointer from integer without a cast
解释:return使integer转换为pointer,没有加强制类型转换。
8、warning: incompatible implicit declaration of built-in function 'printf'
解释:与内置的printf函数隐士声明不兼容。
9、warning: initialization discards qualifiers from pointer target type
解释:initialization取消了指针目标类型的限定。
10、warning: comparison is always false due to limited range of data type
由于类型限制,比较一直是假
11、warning: assignment from incompatible pointer type
不兼容的指针间赋值
12、warning: passing argument 1 of 'mes_read_time' discards qualifiers from pointer target type12、
mes_函数第一个参数的传递,丢弃了指针目标类型限定。
13、warning: &protocol_type& redefined
——type重定义
14、warning: 'return' with a value, in function returning void
在void返回类型的函数中,return返回值。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:344526次
积分:4979
积分:4979
排名:第2931名
原创:150篇
转载:37篇
评论:114条
(2)(3)(2)(1)(2)(2)(1)(4)(2)(1)(3)(1)(1)(5)(6)(3)(3)(4)(4)(5)(5)(7)(14)(6)(7)(3)(2)(9)(6)(1)(4)(8)(9)(5)(1)(4)(5)(10)(19)(2)(3)(1)(4)1.运行成功,输出fuck&br&&div class=&highlight&&&pre&&code class=&language-cpp&&&span class=&cp&&#include &stdio.h&&/span&
&span class=&kt&&void&/span& &span class=&nf&&print&/span&&span class=&p&&(&/span&&span class=&kt&&char&/span&&span class=&o&&*&/span& &span class=&n&&s&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&n&&printf&/span&&span class=&p&&(&/span&&span class=&s&&&%s&/span&&span class=&se&&\n&/span&&span class=&s&&&&/span&&span class=&p&&,&/span& &span class=&n&&s&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&span class=&kt&&int&/span& &span class=&nf&&main&/span&&span class=&p&&()&/span&
&span class=&p&&{&/span&
&span class=&kt&&char&/span&&span class=&o&&*&/span& &span class=&n&&test&/span& &span class=&o&&=&/span& &span class=&s&&&fuck&&/span&&span class=&p&&;&/span&
&span class=&n&&print&/span&&span class=&p&&(&/span&&span class=&n&&test&/span&&span class=&p&&);&/span&
&span class=&k&&return&/span& &span class=&mi&&0&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&2.&br&&div class=&highlight&&&pre&&code class=&language-cpp&&&span class=&cp&&#include &iostream&&/span&
&span class=&k&&using&/span& &span class=&n&&std&/span&&span class=&o&&::&/span&&span class=&n&&cout&/span&&span class=&p&&;&/span&
&span class=&k&&using&/span& &span class=&n&&std&/span&&span class=&o&&::&/span&&span class=&n&&endl&/span&&span class=&p&&;&/span&
&span class=&kt&&void&/span& &span class=&nf&&print&/span&&span class=&p&&(&/span&&span class=&kt&&char&/span&&span class=&o&&*&/span& &span class=&n&&s&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&n&&cout&/span&&span class=&o&&&&&/span&&span class=&n&&s&/span&&span class=&o&&&&&/span&&span class=&n&&endl&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&kt&&int&/span& &span class=&nf&&main&/span&&span class=&p&&()&/span&
&span class=&p&&{&/span&
&span class=&kt&&char&/span&&span class=&o&&*&/span& &span class=&n&&test&/span& &span class=&o&&=&/span& &span class=&s&&&fuck&&/span&&span class=&p&&;&/span&
&span class=&n&&print&/span&&span class=&p&&(&/span&&span class=&n&&test&/span&&span class=&p&&);&/span&
&span class=&k&&return&/span& &span class=&mi&&0&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&br&warning:&br& deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]&br&
char* test = &fuck&;
1.运行成功,输出fuck#include &stdio.h&
void print(char* s)
printf("%s\n", s);
int main()
char* test = "fuck";
print(test);
不同的语言,不同的标准,
C的字符串字面量是char[N]等等&br&C++的字符串字面量是char const[N]等等
C的字符串字面量是char[N]等等C++的字符串字面量是char const[N]等等
题主的写法是有缺陷的。在C/C++下。字符串字面值算常量,需要用const修饰:&br&&div class=&highlight&&&pre&&code class=&language-cpp&&
&span class=&k&&const&/span& &span class=&kt&&char&/span&&span class=&o&&*&/span& &span class=&n&&s&/span& &span class=&o&&=&/span& &span class=&s&&&ABCD&&/span&&span class=&p&&;&/span&
&/code&&/pre&&/div&&br&抑或写成数组:&br&&div class=&highlight&&&pre&&code class=&language-cpp&&
&span class=&kt&&char&/span& &span class=&n&&s&/span&&span class=&p&&[]&/span& &span class=&o&&=&/span& &span class=&s&&&ABCD&&/span&&span class=&p&&;&/span&
&/code&&/pre&&/div&&br&题主说GCC下没有警告,无非是版本过低,或没有设置警告选项。GCC用 -Wall 参数打开所有警告,写成命令行是:&br&&div class=&highlight&&&pre&&code class=&language-bash&&
gcc -Wall FILE_NAME.C
&/code&&/pre&&/div&&br&完整的例子:&br&&div class=&highlight&&&pre&&code class=&language-cpp&&
&span class=&cp&&#include &stdio.h&&/span&
&span class=&kt&&void&/span& &span class=&nf&&print&/span&&span class=&p&&(&/span&&span class=&k&&const&/span& &span class=&kt&&char&/span&&span class=&o&&*&/span& &span class=&n&&s&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&n&&printf&/span&&span class=&p&&(&/span&&span class=&s&&&%s&/span&&span class=&se&&\n&/span&&span class=&s&&&&/span&&span class=&p&&,&/span& &span class=&n&&s&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&span class=&kt&&int&/span& &span class=&nf&&main&/span&&span class=&p&&()&/span&
&span class=&p&&{&/span&
&span class=&k&&const&/span& &span class=&kt&&char&/span&&span class=&o&&*&/span& &span class=&n&&s&/span& &span class=&o&&=&/span& &span class=&s&&&ABCD&&/span&&span class=&p&&;&/span&
&span class=&n&&print&/span&&span class=&p&&(&/span&&span class=&n&&s&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&br&或:&br&&div class=&highlight&&&pre&&code class=&language-cpp&&
&span class=&cp&&#include &stdio.h&&/span&
&span class=&kt&&void&/span& &span class=&nf&&print&/span&&span class=&p&&(&/span&&span class=&kt&&char&/span&&span class=&o&&*&/span& &span class=&n&&s&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&n&&printf&/span&&span class=&p&&(&/span&&span class=&s&&&%s&/span&&span class=&se&&\n&/span&&span class=&s&&&&/span&&span class=&p&&,&/span& &span class=&n&&s&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&span class=&kt&&int&/span& &span class=&nf&&main&/span&&span class=&p&&()&/span&
&span class=&p&&{&/span&
&span class=&kt&&char&/span& &span class=&n&&s&/span&&span class=&p&&[]&/span& &span class=&o&&=&/span& &span class=&s&&&ABCD&&/span&&span class=&p&&;&/span&
&span class=&n&&print&/span&&span class=&p&&(&/span&&span class=&n&&s&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&br&还有题主用“fuck”这个词,是打算一辈子作普通人莫?
题主的写法是有缺陷的。在C/C++下。字符串字面值算常量,需要用const修饰: const char* s = "ABCD";抑或写成数组: char s[] = "ABCD";题主说GCC下没有警告,无非是版本过低,或没有设置警告选项。GCC用 -Wall 参数打开所有警告,写成命令行是: gcc -Wall…请教gcc编译下的几个警告该怎么去除,
[问题点数:20分,结帖人zhoujiawen]
请教gcc编译下的几个警告该怎么去除,
[问题点数:20分,结帖人zhoujiawen]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 gcc 警告选项 的文章

 

随机推荐