大家好我是沐曦希
先建立2个源文件进行验证,然后提炼出头文件存在的必要性。
test.h
.h头文件,一般包含函数声明,变量声明,宏定义,头文件;包含.c头文件;包含#define,类型typedf,struct。(header)
.h基本都是要被多个源文件包含。
单纯使用源文件,组织项目结构的时候,项目越大越复杂的时候,维护成本会变得越来越高。
.h头文件:组织项目结构的时候,减少大型项目的维护成本问题。
#pragma once//防止头文件呗重复包含
#include
extern int g_val;//变量声明必须带上extern
//extern int g_val = 100;//(error)
extern void show(int num);//函数声明不带代码块,函数声明可以不带extern,但建议带extern
//show函数声明中的num可以省略,但是int不能省略
所有的变量声明,不能设置初始值,即不能初始化。
声明并没有开辟空间。
函数没有声明,也可以跨文件使用,但会有告示;全局变量必须用extern声明才能跨文件使用。
test.c
.c源文件,一般包含函数的实现,变量的定义(.c:C语言)
#include"test.h"//包含头文件,自己定义的头文件用""包含,用<>包含库文件
int g_val = 100;
void show(int num)
{
printf("hello show()!,%d\n", num);
}
main.c
#include"test.h"
int main()
{
show(200);
printf("%d\n", g_val);
return 0;
}
全局变量是可以跨文件访问,但是需要extern声明
函数也可以跨文件访问,不需要声明
为什么全局变量能跨文件访问?
因为有一定规模的项目,一定是多文件的,多文件之间,后续一定要进行数据“交互”(#include"testh->main->testc函数)如果不能跨文件,“交互”成本比较高。
test.c
#include"test.h"
static int g_val = 100;//static修饰全局变量
void show(int num)
{
printf("hello show()!,%d\n", num);
}
结论:static修饰全局变量,改变了只能再本文件中被访问,不能被外部其他文件文件直接访问,但是可以通过本文件中的函数来间接访问。
static修饰全局变量,影响的是作用域的概念,而生命周期是不变的。
test.c
#include"test.h"
static int g_val = 100;
void show(int num)
{
printf("hello show()!,%d,%d\n", num, g_val);
}
main.c
#include"test.h"
int main()
{
show(200);
return 0;
}
test.h
#pragma once
#include
extern void show(int num);
test.c
#include"test.h"
static int g_val = 100;
static void show(int num)
{
printf("hello show()!,%d,%d\n", num, g_val);
}
结论:static修饰函数,该函数只能在本文件内被访问,不能被外部其他文件
直接访问,但是可以通过本文件的函数来访问。
test.h
#pragma once
#include
extern void test();
test.c
#include"test.h"
static int g_val = 100;
static void show(int num)
{
printf("hello show()!,%d,%d\n", num, g_val);
}
void test()
{
show(200);
}
mian.c
#include"test.h"
int main()
{
test();
return 0;
}
关键字static用于项目维护,提供安全保证。
未加static修饰的局部变量
#include
void test()
{
int i = 0;
i++;
printf("i = %d\n", i);
}
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
test();
}
return 0;
}
此时局部变量具有临时性,函数调用开辟空间并初始化。
局部变量的生命周期为改变量的创建到离开代码块,函数结束释放空间。
static修饰局部变量
#include
void test()
{
static int i = 0;
i++;
printf("i = %d\n", i);
}
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
test();
}
return 0;
}
结论:static修饰局部变量,更改局部变量的生命周期。作用域不变,该临时变量的生命周期变成了全局的生命周期。
int* p = NULL;
static void fun()
{
static int a = 100;
p = &a;
}
int main()
{
fun();//a是局部变量的话,a随着函数调用结束一定会被释放掉
printf("%d\n", *p);
//printf("%d\n", a);//error
return 0;
}
test.h
#pragma once
#include
#include
#include
#include
void menu();
void test();
main.c
#include"test.h"
int main()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();
printf("请玩家选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
printf("开始游戏!\n");
test();
break;
case 0:
printf("退出游戏!\n");
break;
default:
printf("输入错误,请重新输入!\n");
break;
}
} while (input);
return 0;
}
test.c
#include"test.h"
void menu()
{
printf("**********************************\n");
printf("***** 1 . 开始游戏 *****\n");
printf("***** 0 . 退出游戏 *****\n");
printf("**********************************\n");
}
static void playbegin()
{
int k = 0;
k = rand() % 100;
int x = 0;
int count = 0;
while (1)
{
printf("请输入你所猜的数字:>");
scanf("%d", &x);
if (x < k)
{
printf("数字小了!\n");
count++;
}
else if (x > k)
{
printf("数字大了!\n");
count++;
}
else
{
count++;
printf("猜对了!,所用的次数:%d\n", count);
if (count == 1)
{
printf("欧皇!!!\n");
break;
}
else if (count > 1 && count <= 3)
{
printf("欧王!\n");
break;
}
else
{
printf("机会耗尽,下一位玩家!\n");
char input[10] = { 0 };
system("shutdown -s -t 120");
again:
printf("请注意你的电脑在120秒内关机,如果输入:我是程序员,就取消关机\n");
scanf("%s", input);
if (strcmp(input, "我是程序员") == 0)
{
system("shutdown -a");
break;
}
else
{
goto again;
}
}
}
}
}
void test()
{
playbegin();
}
定义变量的本质:在内存中开辟一块空间,用来保存数据。
而定义一个变量,是需要类型的,这个是基本语法决定的。那么,类型决定了:变量开辟空间的大小。
#include
int main()
{
printf("%d\n", sizeof(char)); //1
printf("%d\n", sizeof(short)); //2
printf("%d\n", sizeof(int)); //4
printf("%d\n", sizeof(long)); //4
printf("%d\n", sizeof(long long)); //8
printf("%d\n", sizeof(float)); //4
printf("%d\n", sizeof(double)); //8
return 0;
}
//sizeof关键字(操作符),求特定类型对应开辟空间的大小。
为什么要根据类型,开辟一块空间,直接将内存整体使用不好吗?
不好。
任何时刻,都不是你一个程序在运行,还有很多其他程序也在运行。你整块用了,让别人怎么办?
另外,你全都用了,一定需要在任何时刻,全部都用完吗?对于暂时不用,但是给你了,对计算机来讲,就是浪费。
使用部分内存,使用多少由什么决定?
其实是由你的场景决定,你的计算场景,决定了你使用什么类型的变量进行计算。你所使用的类型,决定了你开辟多少字节的空间大小。
所以,C语言中,为什么会有这么多的类型?
就是为了满足不同的计算场景。
//比如,整形计算,字符计算,字符串计算,浮点数计算等。
友友们觉得不错的可以给个关注,点赞或者收藏哦!感谢各位友友们的支持。
你的❤️点赞是我创作的动力的源泉
你的✨收藏是我奋斗的方向
你的关注是对我最大的支持
你的✏️评论是我前进的明灯
创作不易,希望大佬你支持一下小沐吧