Chinaunix首页 | 论坛 | 博客
  • 博客访问: 318968
  • 博文数量: 63
  • 博客积分: 2344
  • 博客等级: 大尉
  • 技术积分: 628
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-13 11:09
个人简介

有一种沉默叫霸气,有一种内敛叫个性,有一种简单叫深遂,有一种不屑叫自我

文章分类

全部博文(63)

文章存档

2013年(10)

2012年(12)

2011年(1)

2010年(9)

2009年(31)

分类: C/C++

2009-07-13 16:14:53

1. warning: function declaration isn't a prototype
 
示例:
int function() 改为 int function(void)
 
2. multiple definition of " "
慢慢的自己写的代码 ,有很多了,自己总是加入一些新的东西,并一点点地完善着它,后来想编译一下,看看能否运行了,却出现了几十行的“multiple   definition   of ”

我把所有的全局变量写在一个global.h里,然后其他文件都include 了它 ,于是出现了 multiple   definition   of  .....

(编译器 gcc )

后来在网上搜到了很多类似的错误,大家各有各的烦心事。

我的代码结构

main.cpp
#include "global.h"

WinMain(....)
{
...
}

file_1.cpp
#include "global.h"
....

file_2.cpp
#include "global.h"

...

由于工程中的每个文件都是独立的解释的,
(即使头文件有
#ifndef _x_h
....
#enfif   )

在其他文件中只要包含了global.h 就会独立的解释,然后生成每个文件生成独立的标示符。在编译器连接时,就会将工程中所有的符号整合在一起,由于,文件中有重名变量,于是就出现了重复定义的错误。


下面是解决方法:

在global.c(或.cpp)  中声明变量,然后建一个头文件global.h 在所有的变量声明前加上extern ...
如 extern HANDLE ghEvent;
注意这儿不要有变量的初始化语句。

然后在其他需要使用全局变量的 cpp文件中包含.h 文件而不要包含 .cpp 文件。编译器会为global.cpp 生成目标文件,然后连接时,在使用全局变量的文件中就会连接到此文件 。
 
3. 结构体的multiple definition
用户定义的结构体的正确使用应该是:在一个.h文件中实现结构体类型(但不声明变量),在一个包含该.h的.c文件中声明结构体变量,在其他的用到该结构体的文件中用extern声明该变量。这样该结构体就成为全局的了,按上述说法放心使用吧。
 
4. 内联函数的multiple definition
在内联函数定义的时候,使用static限制,具体原因请参照static作用。
 
5. suggest parenthess around asignment used as true value
这是个警告信息,是提醒programmer在判断的地方使用了"="而不是"==",是否是programmer的本意。
 
6. warning:iso c requires whitespace after the macro name
在本人的代码中出现这个warning的地方是:
#ifndef  __RECONFIG.H__
#define  __RECONFIG.H__
 
原因:字符'.'不能出现在变量名中。 怎么改就不用多说了吧(_RECONFIG_H或_RECONFIG_H_或RECONFIG_H_)。
 
7. warning: passing arg 2 of ` ' from incompatible pointer type
此warning的意思是第二个参数的指针类型不匹配。
 
项目中遇到的这个warning一直困扰着我,看了很多网页得到点启发,才解决这个问题。其实,这个warning很简单就是实参与形参的类型(指针类型)不匹配。项目中遇到的情况是:
函数原型:func(char array[], int *len)
用到的结构体,在一个.h文件中定义:
struct m{
     char m_array[8];
     int  len;
}
在一个.c文件中申明一个变量:struct m mm;
在使用func()函数的函数中如下使用:
father_func(){
     ....
     struct m *pm = &mm;
     ....
     func(pm->m_array, &pm->len);
     ....
}
红色字体处出现此warning。
改正:func(pm->m_array, (int *)&pm->len);
强制类型转换成int *就行了,具体原因说不好,期待高人指点。
阅读(4041) | 评论(0) | 转发(0) |
0

上一篇:关于diff和patch

下一篇:c language基本知识点

给主人留下些什么吧!~~