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 *就行了,具体原因说不好,期待高人指点。
阅读(4110) | 评论(0) | 转发(0) |