当前位置:网站首页>C语言:使用.h和.c文件遇到的问题总结
C语言:使用.h和.c文件遇到的问题总结
2022-06-11 16:52:00 【NI3E】
全局变量是什么?
在所有函数外部定义的变量称为全局变量(Global Variable),它的作用域默认是整个程序,也就是所有的 .c 和 .h源文件。
extern的使用,include的使用
表明变量或者函数是定义在其他其他文件中的,仅仅是一种“暗示”。
·如果需要调用其他.c文件中的函数or变量,在文件中声明前加extern即可,不加extern而直接声明也可以,因为声明全局函数or变量默认前面带有extern。
·如果不想让其他.c文件引用本文件中的变量,加上static即可。
·在“写全局变量”的.c.h的地方写extern,在其他引用的.c里面直接用。
·尽量应该避免不同.c文件里面函数名称相同的问题。
·include相当于把include .h文件直接带入到本源文件里,比如在b.c文件里include "a.h",就相当于把a.h文件里所有定义的变量和函数全部拷贝了一份放入了b.c里,一个项目里,一个.h文件可能会被多个.c源文件包含,这样编译的时候就会报重复定义的错误。而且尽量不要在.h里定义变量,这是一个不好的习惯。
·区分声明和定义。
在.h和.c里面放什么?
本质上没有任何区别。一般:
.h文件是头文件,内含函数声明、宏定义、结构体定义等内容
·如果在C文件中声明宏,结构体,函数等,那么要在另一个C文件中引用相应的宏,结构体,就必须重复的声明。所以把他放在.h里面。
.c文件是程序文件,内含函数实现,变量定义等内容。
是什么后缀也没有关系,只不过编译器会默认对某些后缀的文件采取某些动作。你可以强制编译器把任何后缀的文件都当作c文件来编。
.h文件引用问题?
现在有A.h B.c C.c (main)三个文件
A.h声明结构体,函数。
B.c里面放需要的函数和一些数据。
C.c(main)调用A中函数和C中数据,执行程序。
需要在C里面#include"B.c"且#include"A.h"
需不需要再B里面#include"A.h"?
如果B中引用: [Error] redefinition of 'XXX'

重复引用导致报错,只需要include一次。
为了避免对这个问题的过分讨论,可以添加#ifndef条件编译。
//A.h
#ifndef A_H
#define A_H
#endif现在只有[Error] 'XXXX' does not name a type。
条件编译能够避免重复引用,涉及多个.c或者.h的时候避免出错。
显示does not name a type?
[Error] 'XXX' does not name a type
参考他人的博客,头文件互相包含时会出现这种错误,但是我只有A.h一个头文件,不可能是这种错误。
语句是不能写在函数外面全局变量之中的,需要写在函数里面。
我错误的在函数外面对已经声明的变量进行了赋值操作,把操作语句放在函数里面就不会报错。
补充:在全局范围内声明变量时,同样只能进行初始化,不可以对其赋值。
全局数组?
可以是,和正常数组一样。
·全局数组的初始化值不一样,并且需要具体长度。
·数组名是数组的首地址,是一个指针常量,很多时候我们可以将数组名当指针来用,但在全局变量的外部引用中,全局数组和全局指针变量的引用方式还是有区别的。
·如果将全局数组按指针声明的方式来引用,编译可能不会报错,但在执行的时候会出现意想不到的问题,最常见的应该就是段错误。(这个没查到具体的不同的例子哈哈哈)

参考:
https://blog.csdn.net/u011328417/article/details/98876517
https://blog.csdn.net/qq_27664167/article/details/82859852
“且将新火试新茶,诗酒趁年华。”
边栏推荐
- 学生网站模板棕色蛋糕甜品网站设计——棕色蛋糕甜品店(4页) 美食甜品网页制作期末大作业成品_生鲜水果网页设计期末作业
- ASP.NET教育OA系统源码 教育行业OA系统源码带文档
- 网络流媒体协议的联系与区别(RTP RTCP RTSP RTMP HLS)
- Connection and difference of network streaming media protocol (RTP RTCP RTMP HLS)
- Redis - learn five types of NoSQL
- leetcode417. Pacific Atlantic current problems (medium)
- Redis --- 学习 NoSQL 五大类型
- Analysis report on sales status and supply and demand prospects of phosphoric acid fuel cell industry in the world and China 2022-2028 Edition
- Solve the problem that jupyter cannot connect to the kernel based on pycharm and Anaconda -- solution 1
- 基于文本驱动用于创建和编辑图像(附源代码)
猜你喜欢

Center detection of circular marking points for opencv camera calibration

CLP Jinxin helps Rizhao bank put into operation its new financial ecological network

所见即所得的 markdown 编辑器:Typora

C语言各数据类型的内存映像

【opencvsharp】opencvsharp_ samples. Core sample code Notes

Composition of JVM

VLAN partition and routing between VLANs

ShellBrowser .NET Crack

消息队列-推/拉模式学习 & ActiveMQ及JMS学习

2022年安全员-B证国家题库及模拟考试
随机推荐
leetcode463. Perimeter of the island (simple)
Why does chip design also need "Craftsmanship"?
笔记本连接外部键盘后,如何把笔记本自身的键盘禁用
虚拟局域网划分与虚拟局域网间路由(VLAN)
2022 safety officer-a certificate test question simulation test question bank simulation test platform operation
Oracle生成不重复字符串 sys_guid()与Mysql生成唯一值
ASP. Net education OA system source code education industry OA system source code with document
leetcode417. Pacific Atlantic current problems (medium)
Analysis report on future development trend and investment suggestions of global and Chinese soybean protein industry 2022-2028
Is the securities account given by qiniu business school safe? Do you charge for opening an account
2022 simulated examination question bank and simulated examination for crane driver (limited to bridge crane)
Database backup (MySQL)
Development planning of China's stainless steel market and suggestions on the development direction of the 14th five year plan 2022-2028
Pycharm使用小技巧 - 如何设置背景图片
CLP Jinxin helps Rizhao bank put into operation its new financial ecological network
Le compte de titres de l'école de commerce kainiu est - il sécurisé? Frais d'ouverture de compte
Pychart tips - how to set up a background picture
开关电源电路图及原理12v分析-详细版
数据库全量SQL分析与审计系统性能优化之旅
2022 R1 quick opening pressure vessel operation test question bank and simulation test