c++函数的定义和声明
函数和变量的声明可以有多次,但是定义只能有一次
其实头文件可以写函数的定义,但是在工程里面很多人引用这个头文件很容易造成重复定义的情况
有一个例外情况头文件里面也可以写函数定义或者变量定义
一般情况
//2.h
#pragma once
int add(int a, int b);int div1(int a, int b) {return a - b;
}
//1.cpp
#include<iostream>
#include "2.h"
using namespace std;int main() {cout << add(1, 2) <<endl;return 0;
}
//3.cpp
#include "2.h"
重复定义了
法一:加上static
//2.h
#pragma once
int add(int a, int b);static int div1(int a, int b) {return a - b;
}
发现没有报错
加了static以后函数仅在原文件中生效,所以可以被不同的cpp原文件引入
法二:加上inline
//2.h
#pragma once
int add(int a, int b);inline int div1(int a, int b) {return a - b;
}
也没有报错
变量同理
嵌套头文件包含问题
若2.h调用3.h,3.h调用2.h
这样的话我在头文件里面写了一个static函数的定义,会不会有很多个div1函数
//2.h
#include "3.h"
int add(int a, int b);inline int div1(int a, int b) {return a - b;
}
//3.h
#include "2.h"
报错
法一:头文件里面加上#pragma once
//2.h
#pragma once
#include "3.h"
int add(int a, int b);inline int div1(int a, int b) {return a - b;
}
//3.h
#pragma once
#include "2.h"
这样的话嵌套调用就可以只调用一次了(不代表整个工程只引用一次)
但是有的编辑器不支持
而且加了#pragma once,直接就是整个文件了,不能针对文件的部分
下面介绍一个万能解决办法
法二:宏定义来解决问题
#ifndef _HE2_
#define _HE2_
```
```这中间写想只被编译一次的内容
```
#endif
这个方法也可以控制软件的版本
extern-解决c和cpp混用的问题
//4.c
int add(int a, int b) {return a + b;
}
//1.cpp
#include<iostream>
using namespace std;int add(int a, int b) {return a + b;
}int main() {cout << add(1, 2) <<endl;return 0;
}
//2.h
#pragma once
int add(int a, int b);
发现不报错
把4.c改成4.cpp
注意函数名字后面加的这一条,这在c++里面是为了实现函数的重载,所以要加那么一串(函数名代表地址)
把1.cpp改成1.c
//1.c
#include<stdio.h>
int add(int a, int b) {return a + b;
}
int main() {printf("%d",add(1, 2));return 0;
}
报错
若在1.cpp中调用4.c的add(),用不了,因为c语言不支持重载(所以c语言的编译器不会在函数后面加那一串小尾巴)
那么怎么在cpp中调用c文件呢?
//1.cpp
#include<iostream>
#include "4.h"
using namespace std;int main() {cout << add(1, 2) <<endl;return 0;
}
//4.h
extern "C" int add(int a, int b);
//4.c
int add(int a, int b) {return a+b;
}
在头文件定义时候加上extern "C"
如果有多个函数
extern "C" {int add(int a, int b);int div1(int a, int b);
}
如果需要把几个c语言的头文件全部加进来
extern "C" {#include "2.h";#include "3.h";
}
C语言不能调用cpp(没有办法)
注意事项
如果c文件调用那个头文件带了extern "C"
,就会报错
解决办法
采用宏定义来控制其在cpp调用c语言函数时候加上extern "C"
#ifdef __cplusplus
extern "C"
#endif
当你把c语言的函数定义成为extern "C"
,这个函数名就不支持函数重载了