C语言常见错误与警告

C语言常见错误与警告
C语言常见错误: 
1 invalid type argument of ‘->’ (have ‘struct qstr_xid_element’)
   这种错误一般是没有理解C中“->”与“.”用法的不同,“->”是指向结构体指针获取结构体的成员变量时所用,而“.”则是一般的结构体名获取结构体的成员变量时所用。简单来说,如果符号前是指针类型,那么用“->”,否则用“.”


2 make: *** /lib/modules/2.6.32-431.el6.x86_64/build/: No such file or directory.  Stop 
   原因:系统没有安装内核开发包,在上述所示的路径中查找build文件,发现没有此文件或者文件链接失效,然后到/usr/src/kernels/中查看是否有对应的开发包
   解决办法:1 yum install kernel-devel-$(uname -r)
          2 如果找不到yum源,那么可以直接从网上下载对应的内核开发包,放入/usr/src/kernels/中,并rpm -i kernel-devel-xxx.rpm。如果内核版本不同,需要重新做一个链接,首先删除错误链接:rm build;然后查看当前内核版本:uname -r;新建一个链接:ln -s /usr/src/kernels/3.10.0-327.2.e17.x86_64/build


3 Error downloading packages:
   解决办法:执行yum clean all 清除缓存目录下的软件包及旧的headers;然后重新yum install
   参考:http://wenzhongxiang.blog.51cto.com/6370734/1434577 点击打开链接


4 您可以尝试添加 –skip-broken 选项来解决该问题
    ** 发现 19 个已存在的 RPM 数据库问题, ‘yum check’ 输出如下
   解决办法:1 package-cleanup --cleandupes
             2 yum install XXX
   如果发现需要安装的包的版本低于安装的版本:yum makecache


5 如果出现 致命错误:scsi/sg.h:没有那个文件或目录
   此文件是Linux内核中的头文件,在/usr/include中的对应路径下确实没有找到此文件,但是在/usr/src/kernels/3.10.0-123.el7.x86_64/include的目录下又找到了此文件
   解决办法:从/usr/src/kernels/3.10.0-123.el7.x86_64/include中将所需的文件拷到/usr/include中的对应路径下,这里可能导致又会出现其他依赖的头文件找不到,只能继续拷贝了。也许有其他办法,不过我只能找到这个笨办法
   参考:http://blog.csdn.net/ysdaniel/article/details/7043381点击打开链接
   此处可能会有帮助http://www.phpfans.net/ask/linux1/3585236355.html点击打开链接


6 在gdb的工程中,调试时的代码执行时乱序的     
   原因:这是由于代码在编译阶段经过了编译器的优化导致 
   解决办法:关闭优化选项即可。只要将Makefile(或者执行命令)中的CFLAGS += -O(-O2 -O3)去掉即可


7 variable ‘XXX’ has initializer but incomplete type
   原因:一般都是头文件的问题,看看头文件是否引用正确
   在一个项目的MT测试过程中,我们需要通过gdb调试来确认代码的正确性。然而在gdb调试过程中,我们发现程序在运行时内存实际的访问顺序与代码的编写顺序并不一致(内存的乱序访问),究其原因,是为了提高程序的运行效率。一般有两种情况:
   1 代码在编译阶段经过编译器的优化而导致内存乱序访问(如使用优化选项O2或者O3编译代码)
     为了解决此问题,Linux 内核提供函数 barrier() 用于让编译器保证其之前的内存访问先于其之后的完成。


   2 多 CPU 间交互引起内存乱序访问,运行时,乱序处理器(Out-of-order processors)处理指令通常有以下几步:
     指令获取
     指令被分发到指令队列
     指令在指令队列中等待,直到输入操作对象可用(一旦输入操作对象可用,指令就可以离开队列,即便更早的指令未被执行)
     指令被分配到适当的功能单元并执行
     执行结果被放入队列(而不立即写入寄存器堆)
     只有所有更早请求执行的指令的执行结果被写入寄存器堆后,指令执行的结果才被写入寄存器堆(执行结果重排序,让执行看起来是有序的)
     乱序执行相比有序执行能够避免等待不可用的操作对象(有序执行的第二步)从而提高了效率。现代的机器上,处理器运行的速度比内存快很多,有序处理器花在等待可用数据的时间里已经可以处理大量指令了


8 do{...}while(0)的作用
    作用1:定义宏,实现局部作用域。我们知道宏是简单粗暴的替换,如果在if...else...的上下文中使用宏,而宏定义了多条语句,那么此宏的多条语句可能需要用{}括起来,根据不同情况可能需要加上或者不加分号(;),那么怎么统一呢,这时就用到do{...}while(0)
    作用2:替代goto。我们是不倡导使用goto语句的,用do{...}while(0)在某些情况下是可以替代goto


9 collect2: error: ld returned 1 exit status
    解决:这里我出现的原因是函数在声明时没有实现,即使是空实现{}也是要加上的


10 error: invalid storage class for function ‘XXX'
    原因:我出现这种情况的原因是代码中少了一个‘}’
 
11  error: too many arguments to function ‘pthread_create’
   pthread_create(&tid,&attr,&func,(void)arg)只能传递一个参数给func,要是要传一个以上的参数,请定义成结构体形式。
   
12  undefined reference to `pthread_create'
   在linux上执行gcc thread.c,  结果出现编译错误undefined reference to 'pthread_create'。由于pthread库不是标准linux库, 所以出错。 改为gcc thread.c -lpthread 即可。
   
13  加载内核模块的错误:insmod: ERROR: could not insert module xxx.ko: Unkown symbol in module
   原因1:编译的内核版本与运行的内核版本不一致导致的
   解决办法:KERNELDIR := /lib/modules/$(shell uname -r)/build
             PWD := $(shell pwd)
             $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
这样编译。
   原因2:由于模块依赖的其他模块没有加载导致的。
   解决办法1:dmesg | tail 看输出信息中的Unknown symbol,加载上这些模块。
           2:modinfo  ./igb.ko | grep depend找模块的依赖,如:depends: dca
      然后执行  modprobe dca
            insmod ./XXX.ko
参考:http://blog.csdn.net/wl_fln/article/details/9465341

14  加载内核模块的错误:insmod: ERROR: could not insert module xxx.ko:File exits
   原因:说明已经加载过xxx.ko'啦  不能重复加载
   
15  undefined reference to pthread_join
   原因: pthread 库不是 Linux 系统默认的库,连接时需要使用静态库 libpthread.a
   解决办法:在编译中要加 -lpthread参数。
   
16  GDB出现no debugging symbols found 
   原因:这是因为编译时没有加-g
   解决办法,如:
   gcc test.c -o test -lpthread
   改成
   gcc test.c -o test -g -lpthread 
   
17  static declaration follows non-static declaration
   原因是调用的静态函数没有先声明一下,就是它定义在你调用之后啦。
   解决办法:调用之前声明一下这个函数。
   
18  在struct fd_set fds时发生storage size of 'fds' isn't known
   原因:fd_set是通过typedef重新声明的新类型,所以fd_set就相当于struct fd_set
   解决办法:去掉struct,写成:fd_set fds;


19  make: *** /lib/modules/2.6.32-573.7.1.el6.x86_64/build/: No such file or directory. Stop.  
   解决办法:
      1、安装内核开发包
        $ sudo yum install -y kernel-devel kernel-headers
如果上述执行后,发现安装的内核开发包的版本与当前运行的内核版本不一致:
$ sudo yum install "kernel-devel-uname-r == $(uname -r)"
如果上述执行结果是:No package kernel-devel-uname-r == 3.12.6- 200.fc19.x86_64 available.Error: Nothing to do。那么


      2、重新创建符号链接
        $ ln -s /usr/src/kernels/2.6.32-573.7.1.el6.x86_64/ /lib/modules/2.6.32-431.el6.x86_64/build 
        $ ll /lib/modules/2.6.32-431.el6.x86_64/build

20 insmod:ERROR:could not insert module xxxx.ko:Invalid module format
   原因:编译的内核版本与运行的内核版本不一致导致的
  
21 -bash:ifconfig:command not found
   原因1:查看path配置,如果没发现/sbin,说明是path有问题
   解决: 打开/etc/profile文件,在其中输入export PATH=$PATH:/sbin
   原因2:输入:find / -name "ifconfig",如果什么也没找到,表示CentOS更换指令了
   解决:将"ifconfig"指令更改为"ip addr"
   参考:https://www.cnblogs.com/dunitian/p/4974761.html
   
22 编译内核,make menuconfig时出错
   /bin/sh: gcc: command not found
   make[1]: *** [scripts/basic/fixdep] Error 127 
   ...
   原因:gcc编译器未安装
   解决:yum install gcc*
   接着make menuconfig可能还会出现错误:
     HOSTCC  scripts/basic/fixdep
     *** Unable to find the ncurses libraries or the
     *** required header files.
*** 'make menuconfig' requires the ncurses libraries.
***
*** Install ncurses (ncurses-devel) and try again.
***
make[1]: *** [scripts/kconfig/dochecklxdialog] Error 1
make: *** [menuconfig] Error 2
   解决:yum install ncurses*   
   参考:http://blog.sina.com.cn/s/blog_875c95f40101kae5.html
   
23 编译内核,fatal error: openssl/aes.h: No such file or directory
   原因:缺少OpenSSL开发包
   解决:$ sudo yum install openssl-devel
   参考:http://blog.163.com/rz_xiaojia/blog/static/11920919820163260234602/
   
24 lspci查看硬件信息时提示找不到命令:-bash: lspci: command not found
   原因:没有安装pciutils包造成的。
   解决:yun install pciutils
   参考:http://blog.163.com/wangpeng922@126/blog/static/6413308320121112312058/
   PS:同样,如果 lsusb 时也提示找不到命令,那只要 #yum install usbutils就可以了


25 error: request for member ‘arg1’ in something not a structure or union  
   原因:. 与 -> 搞错了
   解决:如果它是地址,就在它后边用 ->,如果它不是地址,就在它后边就用 .
   参考:https://www.cnblogs.com/annie-fun/p/6369872.html
   
26 test_rpc.py: error: invalid choice: 's' (choose from 'nvmeerror')
   说明:表示说这个值(s)是无效的,要将s替换成nvmeerror
   
27 error: dereferencing pointer to incomplete type
   原因:这个错误是指针指向的结构体类型没有定义。
   解决:1 没有包含相应的头文件的情况,包含对应头文件就ok了。
         2 自定义的结构体定义在.c文件中,在其他.c文件中使用该结构体指针时,也会出现类似错误。
   
28 error: invalid application of ‘sizeof’ to incomplete type   
   原因:对于不完整类型,sizeof都不能通过编译
   
29 /build/lib/libspdk_bdev_nvme.a(blockdev_nvme_rpc.o):(.data+0x0): multiple definition of `req_timeout_ticks'
   /build/lib/libspdk_bdev_nvme.a(blockdev_nvme.o):(.data+0x8): first defined here
   原因:在头文件中定义了变量或者函数,而非声明。当此头文件被不同的.c文件引用时,编译生成相应的.o文件,链接的时候头文件被重复引用吗,会报重复定义
   解决:在头文件中只声明函数、变量,而不定义。.h 文件中声明函数/变量.c文件中定义函数/给变量赋值,变量面前最好加修饰符extern。
   
C语言常见警告:
1  warning: suggest parentheses around comparison in operand of ‘&’ [-Wparentheses]
   该警告希望你在&(逻辑与)表达式左右加上括号。
   
2  warning: passing argument 3 of ‘pthread_create’ from incompatible pointer type [enabled by default]
   该警告表示函数pthread_create的第三个参数不符合函数定义类型
   ret = pthread_create(&thre_fd[i].tid, NULL, &err_detect, &arg);
   void *err_detect(struct thr_arg *arg);
   
3  warning:ISO C90 forbids mixed declarations and code
   ISO C90 禁止将声明和代码混合,就是说要先声明,再使用
   
4  warning: passing argument 3 of ‘pthread_create’ from incompatible pointer type [enabled by default]
   参数3加上void *。如:pthread_create(&thre_fd[i].tid, NULL, (void *)err_detect, &arg);
   
5  warning:incompatible implicit declaration of built-in function ‘malloc’ [enabled by default]
   解决办法:加入下面的头文件
   #include<stdlib.h>
   #include<string.h>
   
7  warning: "/*" within comment
   原因是注释符"/*"里又嵌套了"/*",把嵌套的注释符去掉即可消除warning。
   
8 warning "implicit declaration of function ‘函数名’ "
    这种错误一般是由于此函数所在的头文件中未对函数进行声明


9 warning: ‘gets’ is deprecated (declared at /usr/include/stdio.h:638)
   http://blog.csdn.net/edwardandroid/article/details/38558545
   
  • 6
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值