C/C++编译问题速查

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C/C++编译问题速查相关的知识,希望对你有一定的参考价值。

背景

写完功能代码后,通常需要自己review几遍。review完之后,就可以开始编译。编译过程中通常会出现些错误,为了快速解决编译错误,下面整理了些常见编译错误的解决办法。

第三方头文件和库缺失

示例: 编译过程中出现下面的错误:

 configure: error: missing dis-asm.h

解决办法:

yum install binutils-devel binutils-devel.x86_64

交叉include头文件

是指在两个独立结构的类的头文件中需要互相使用彼此类型,各自include了对方的头文件。

示例: a.h:

....
#include <b.h>
....

Class A 
    int a;
    B b;
;

A() ;
~A() ;

而另外一个头文件b.h 如下:

....
#include <a.h>
....
Class B 
    int b;
    A a;
;

B() ;
~B() ;

上面这种使用方式是新手常常容易犯的错误,可能会导致许多莫名其妙的编译错误。针对这种问题,最主要的思路就是充分利用C/C++ 声明和实现分开定义的特点。上面改成下面这样就不会有错误了:

示例: a.h:

//#include <b.h>
Class B;

Class A 
    int a;
    B b;
;

A() ;
~A() ;

而另外一个头文件b.h 如下:

....
//#include <a.h>
class A;
....
Class B 
    int b;
    A a;
;

B() ;
~B() ;

那么什么时候需要include 类的头文件呢,需要在使用头文件种声明的函数的时候才需要;如果没有使用声明一个外部类。

类型不匹配

常见的类型不匹配包括: a. 参数数量不匹配; b. 参数类型不匹配; c. 返回值不匹配 d. 声明种定义种的元素类型不匹配; e. 指针类型不匹配; f. 函数指针类型不匹配;

这些编译错误信息通常在日志张都能看到。如果没有编译输出,对于CMake 可以通过make VERBOSE=1去分析;对于makefile 生成的Makefile, 可以通过make V=1 去生成编译信息。

强制转换类型不对

通常的错误包括: a. 非void* 类型的变量通过void 类型的变量赋值 示例如下:

void * pvoid = nullptr;
char * str = pvoid;

b. staic/const cast指针类型转换失败 示例如下:

const void * pvoid = nullptr;
char * str = pvoid;
str = (char *)pvoid;

以上是关于C/C++编译问题速查的主要内容,如果未能解决你的问题,请参考以下文章

C/C++编程笔记:那些不会在C ++中编译的C程序,挺特殊奥~

Visual Studio 2013 中可能存在的 C/C++ 编译器错误

如何在 c / c++ 程序中检测可能/潜在的堆栈溢出问题?

c/c++ 运算溢出问题

Maven速查手册

visual studio code如何运行c