C语言常见错误

一、预处理错误

#include “name”:  自定义的。不仅从系统目录中找,也从当前目录中寻找。
#include <name>:  系统定义的。直接会寻找系统环境变量,不会寻找当前目录。

最常见的错误:not found

例子:

>Step 1

abc.h:

#define ABC 10

test1.c:

#include <stdio.h>
#include "abc.h"
int main()
{
    int a = ABC;
    printf("hello world\n");
    return 0;
}

编译pass:

编译pass

>Step 2

如果将test1.c中的”abc.h”,改为<abc.h>:
#include <stdio.h>
#include <abc.h>
int main()
{
int a = ABC;
printf("hello world\n");
return 0;
}

编译fail:

编译fail

>Step 3

将abc.h移动到一个新的目录:inc。

mkdir inc
mv abc.h ./inc/

test1.c中仍找不到abc.h。

gcc -I 查找头文件的目录
gcc -I ./inc -o build test1.c

即可编译pass


二、编译错误

出错最多,主要是语法错误。
如;忘写、{}写错等。


三、链接错误

语法都没问题,最后在打包的时候出错了。

原因:原材料不够,或者原材料多了。

1、原材料不够:undefined reference

解决:进行实现,并且在链接时加入一起进行链接。

test2.c:

#include <stdio.h>
#include "abc.h"

void fun(void);  // 只有fun函数的声明,没有实现。因此在调用的时候,原材料不够。

int main()
{
    int a = ABC;
    printf("hello world\n");
    fun();
    return 0;
}

编译fail:

undefined reference to 'fun'

解决方法1:直接实现fun函数(增加原材料)

#include <stdio.h>
#include "abc.h"

void fun(void)
{

}

int main()
{
    int a = ABC;
    printf("hello world\n");
    fun();
    return 0;
}

解决方法2:在一个新的.c文件(如abc.c)中实现fun函数(原材料)

abc.c:

void fun(void)
{

}

此时,必须把abc.c和test2.c同时打包生成一个可执行文件才行。

gcc -o build test2.c abc.c  // 这样写可以,但不建议

// 建议这样写:
gcc -c -o a.o test2.c
gcc -c -o b.o abc.c
gcc -o build a.o b.o

2、原材料多了:multiple definition

解决:寻找是否多次实现,只保留一个实现即可。

abc.c:

void fun(void)
{

}

test3.c也对fun()进行了定义:

#include <stdio.h>
#include "abc.h"

void fun(void)
{
    printf("");
}

int main()
{
    int a = ABC;
    printf("hello world\n");
    fun();
    return 0;
}

编译fail:

gcc -c -o a.o test3.c
gcc -c -o b.o abc.c
gcc -o build a.o b.o
multiple definition of 'fun'
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容