一、在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无效。