目录
前言
因为变量是在栈里,是临时变量,所以它作用的范围总是受到一些函数语句等区块的限制。从而据说能够产生千奇百怪的BUG!
正文
导演——头文件
1 #ifndef _ex22_h
2 #define _ex22_h
3 #include "dbg.h"
4
5 //makes THE_SIZE in ex22.c availabale to other .c files
6 extern int THE_SIZE;
7
8 //gets ande sets an internal static vaeravle in ex22.c
9 int get_age();
10 void set_age(int age);
11
12 //updates a static variable that's iniside update_ratio
13 double update_ratio(double ratio);
14
15 void print_size();
16
17 #endif
配角——*.c
主角——*_main.c
#include "ex22.h"
const char *MY_NAME = "Zed A. Shaw";
void scope_demo(int count)
{
log_info("count is : %d", count);
if(count > 10) {
int count=100; //BAD! BUGS!
log_info("count in this scope is %d", count);
}
log_info("count is at exit: %d", count);
count = 3000;
log_info("count after assign: %d", count);
}
int main(int argc, char *argv[])
{
// test out THE_AGE accessors
log_info("My name: %s, age:%d", MY_NAME, get_age());
set_age(100);
log_info("My age is now: %d", get_age());
//test out THE_SIZE extern
log_info("THE_SIEZE IS: %d", THE_SIZE);
print_size(argv);
THE_SIZE = 9;
log_info("THE SIEZE is now: %d", THE_SIZE);
print_size();
//test the ratio function static
log_info("Ratio at first: %f", update_ratio(2.0));
log_info("Ratio again: %f", update_ratio(10.0));
log_info("Ratio once more: %f", update_ratio(300.0));
//test the scope demo
int count = 4;
scope_demo(count);
scope_demo(count *20);
log_info("count after calling scope_demo: %d", count);
return 0;
}
后语
-
头文件
头文件是一种源代码文件,通常以 .h 或 .hpp 为后缀,用于声明函数、类、变量和常量等的定义和接口。在C/C++语言中,头文件通常包含了函数的声明、宏的定义、结构体和类的定义等,它们用于将相关的定义和接口集中在一个地方,方便其他源代码文件的引用和使用。
头文件可以被其他源代码文件通过#include指令引入,使得其他源代码文件能够访问头文件中定义的函数、类、变量和常量等。通过使用头文件,可以提高代码的重用性和可维护性,同时也可以提供更好的代码组织结构和阅读性。
需要注意的是,头文件只包含声明和定义的注释,不包含实现的代码,实现的代码通常是放在对应的源代码文件(通常以 .c 或 .cpp 为后缀)中的。头文件中的声明和定义相当于给其他源代码文件一个使用接口,而实现则是具体的功能的实现。
有关头文件,无意中发现有人写的更好,更详细C语言从头学05——头文件及库文件_c语言库文件和头文件-CSDN博客
-
按值传递
按值传递是一种参数传递的方式,它将参数的值复制一份后传递给函数或方法,而不是传递参数的引用或地址。
在按值传递的方式中,当函数或方法对参数进行修改时,不会影响到外部变量的值。因为传递的是参数值的副本,而不是原始变量的引用。
在许多编程语言中,基本数据类型(如整数、浮点数、布尔值等)通常是按值传递的,而引用数据类型(如数组、字符串、对象等)通常是按引用传递的。但也有一些编程语言允许自定义数据类型按值传递。
总结一下,按值传递是一种参数传递的方式,它将参数的值复制一份后传递给函数或方法,不会影响到外部变量的值
代码示例
1 #include <stdio.h>
2
3 void lessFat(int weigh)
4 {
5 weigh = weigh -70;
6 }
7
8
9 void panGuan(int stuff)
10 {
11 if(stuff== 180){
12 printf("恭喜主人减肥成功!\n");
13 }
14 else{
15 printf("主人,萝卜青菜各有所爱,当个肥佬也不赖!额……你永远是我最爱的那颗大白菜!\n"); }
16 }
17
18 int main(int argc, char *argv[ ])
19 {
20 int meat = 250;
21
22 lessFat(meat);
23 panGuan(meat);
24
25
26 return 0;
27 }
~
~
-
按引用传递
按引用传递(pass-by-reference)是一种函数参数传递的方式。按引用传递时,函数接收的是变量的内存地址,而不是变量的值的副本。这意味着,在函数内部修改参数的值,会影响到原始变量的值。
通过按引用传递参数,可以避免在函数调用时对参数进行复制,从而提高程序的性能。此外,按引用传递还可以实现函数对参数进行修改的功能。
在一些编程语言中,如C++和Python,可以显式地使用引用作为函数参数来实现按引用传递。而在其他一些编程语言中,如Java和C#,则使用特殊的引用类型来实现类似的效果。
代码示例
1 #include <stdio.h>
2
3
4 void less_fat(int *rou)
5 {
6 *rou = *rou - 70;
7 }
8
9 void panGuan(int stuff)
10 {
11 if(stuff== 180){
12 printf("恭喜夫人减肥成功!\n");
13 }
14 else{
15 printf("夫人,减肥之路任重道远,加油!\n"); }
16 }
17
18 int main(int argc, char *argv[ ])
19 {
20 int meat = 250;
21
22 less_fat(&meat);
23 panGuan(meat);
24
25 return 0;
26 }
~
1.我对文件做了一点小改动,把两个c文件包含的头文件dbg放在了ex22.h中,也能正常编译。
觉得很有意思,网上一查,原来C编译器在编译过程中只会处理每个C文件中的头文件一次。当多个C文件包含同样的头文件时,只有第一个C文件会实际包含并编译这个头文件。
当其他C文件也包含这个头文件时,编译器会忽略它们,因为已经在第一个C文件中包含过了。这种机制可以避免头文件包含的重复和冗余。
2.导演/配角/主角是我对这些编译文件的一种变相理解,你们觉得呢?
3.以上代码示例纯粹是最近个人的恶趣味,如果恰巧有人认识家里,还请保密,嘿嘿!