头文件和源文件的一些情况分析

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",这个函数名就不支持函数重载了

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值