Vscode中,C/C++中的#include重复编译,以及定义和声明

文章讲述了在VSCode中使用C++进行多文件编译时遇到的问题,如因#include导致的重复编译和extern/定义的区别。作者分享了解决方法,即如何在头文件中正确声明和定义变量和函数,并指出#ifndef在多文件编译时的局限性。
摘要由CSDN通过智能技术生成

一、在vscode中编译时如果单独文件#include引用,很容易出现重复编译,如下

下面是项目目录

a.cpp代码

#include "link.h"
void tesA();

b.cpp

#include"link.h"
void tesB();
#include<iostream>
using namespace std;
int a()
{
    cout<<"测试a"<<endl;

    return 0;

}

link.h

int a();
int c;

main.cpp

#include "a.cpp"
#include "b.cpp"
using namespace std;
#include<iostream>
int main()
{
    
    a();
    cout<<c<<endl;
    return 0;

}

二、运行结果出现了重定义int c

但是int a()没有,去掉int c之后可以正常运行的,这是因为定义和声明的不同。

对于变量

extern int i是声明,int i是定义

对于函数

int a()和extern int a()都是声明,而extern可以省略。int a(){}是定义,其实c++是可以重声明的,但是不能重定义。但是我的编译器在变量那里加extern也会报错,函数不会。最后发现是需要在主函数里再次重新定义才可使用。

那么怎么在头文件中直接定义呢

如下代码所示:

#ifndef _LINK_H
#define _LINK_H
int a();
int c=5;
#endif

其实函数也可以直接在头文件中声明

link.h

#ifndef _LINK_H
#define _LINK_H
int a()
{
    return 6;
}
int c=5;
#endif

其余代码稍微改动

三、值得注意的是上述情况适用于一个文件的编译,也就是main包含a,b,a和b包含link这种类似的,但如果我们使用vscode进行多文件一起编译则使用#ifndef指令无效。

这里修改task.json

{
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: g++.exe 生成活动文件",
            "command": "C:\\mingw64\\bin\\g++.exe",
            "args": [
                "-fdiagnostics-color=always",
                "-g",
                "*.cpp",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "调试器生成的任务。"
        }
    ],
    "version": "2.0.0"
}

-g 后面改为*.cpp,即将a.cpp b.cpp和main.cpp都编译

那么就会报错

所以对于多文件共同编译,#ifndef无效。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值