七、静态函数与外部函数
7.1 静态函数
// file1.c
#include <stdio.h>
// 静态函数:只在当前文件可见
static void helperFunction(void) {
printf("这是静态函数,只能在当前文件使用\n");
}
// 普通函数:可以被其他文件使用
void publicFunction(void) {
helperFunction(); // 可以调用静态函数
printf("公共函数\n");
}
// 静态函数常用于:
// 1. 内部辅助函数
// 2. 模块内部实现细节
// 3. 避免命名冲突
// file2.c
#include <stdio.h>
// 声明外部函数
extern void publicFunction(void);
// extern void helperFunction(void); // 错误:无法访问其他文件的静态函数
int main() {
publicFunction(); // 可以调用
// helperFunction(); // 编译错误
return 0;
}
7.2 外部函数
// math_utils.h
#ifndef MATH_UTILS_H
#define MATH_UTILS_H
// 函数声明(默认是extern)
int add(int a, int b);
int subtract(int a, int b);
int multiply(int a, int b);
double divide(int a, int b);
#endif
// math_utils.c
#include "math_utils.h"
int add(int a, int b) {
return a + b;
}
int subtract(int a, int b) {
return a - b;
}
int multiply(int a, int b) {
return a * b;
}
double divide(int a, int b) {
return b != 0 ? (double)a / b : 0.0;
}
// main.c
#include <stdio.h>
#include "math_utils.h"
int main() {
printf("10 + 5 = %d\n", add(10, 5));
printf("10 - 5 = %d\n", subtract(10, 5));
printf("10 * 5 = %d\n", multiply(10, 5));
printf("10 / 5 = %.2f\n", divide(10, 5));
return 0;
}
八、可变参数函数
#include <stdio.h>
#include <stdarg.h>
#include <stddef.h>
// 计算多个整数的和
int sum(int count, ...) {
va_list args;
int total = 0;
va_start(args, count);
for (int i = 0; i < count; i++) {
total += va_arg(args, int);
}
va_end(args);
return total;
}
// 格式化输出到字符串(类似sprintf)
int mySprintf(char* buffer, const char* format, ...) {
va_list args;
va_start(args, format);
int result = vsprintf(buffer, format, args);
va_end(args);
return result;
}
// 查找最大值
int findMax(int count, ...) {
va_list args;
va_start(args, count);
int maxVal = va_arg(args, int);
for (int i = 1; i < count; i++) {
int val = va_arg(args, int);
if (val > maxVal) maxVal = val;
}
va_end(args);
return maxVal;
}
// 可变参数函数的遍历
void printAll(const char* format, ...) {
va_list args;
va_start(args, format);
while (*format) {
switch (*format) {
case 'i': {
int val = va_arg(args, int);
printf("%d ", val);
break;
}
case 'f': {
double val = va_arg(args, double);
printf("%.2f ", val);
break;
}
case 's': {
char* val = va_arg(args, char*);
printf("%s ", val);
break;
}
case 'c': {
// char被提升为int
int val = va_arg(args, int);
printf("%c ", val);
break;
}
}
format++;
}
printf("\n");
va_end(args);
}
int main() {
printf("sum(5): %d\n", sum(5, 10, 20, 30, 40, 50));
printf("sum(3): %d\n", sum(3, 100, 200, 300));
char buffer[256];
mySprintf(buffer, "Name: %s, Age: %d", "张三", 25);
printf("格式化结果: %s\n", buffer);
printf("最大值: %d\n", findMax(5, 10, 30, 20, 50, 40));
printAll("iis", 10, 20, "Hello");
printAll("fci", 3.14, 'A', 100);
return 0;
}
九、函数作用域与生命周期
9.1 局部变量
#include <stdio.h>
void function1(void) {
// 局部变量:在函数内定义,只在函数内可见
int localVar = 10;
static int staticVar = 0; // 静态局部变量
localVar++;
staticVar++;
printf("localVar = %d, staticVar = %d\n", localVar, staticVar);
}
// 块级作用域
void blockScope(void) {
int x = 10;
if (x > 0) {
int y = 20; // 只在if块内可见
printf("x=%d, y=%d\n", x, y);
}
// printf("%d\n", y); // 错误:y在此处不可见
}
int main() {
function1(); // localVar=11, staticVar=1
function1(); // localVar=11, staticVar=2
function1(); // localVar=11, staticVar=3
blockScope();
return 0;
}
9.2 全局变量
#include <stdio.h>
// 全局变量:在整个程序中都可见
int globalVar = 100;
// 静态全局变量:只在当前文件可见
static int fileStaticVar = 200;
// 外部全局变量声明
extern int externalVar; // 在其他文件中定义
void printGlobals(void) {
printf("globalVar = %d\n", globalVar);
printf("fileStaticVar = %d\n", fileStaticVar);
printf("externalVar = %d\n", externalVar);
// 可以修改全局变量
globalVar++;
}
int main() {
printGlobals();
printGlobals();
return 0;
}
9.3 寄存器变量
#include <stdio.h>
// 寄存器变量:建议编译器将变量存储在CPU寄存器中
// 用于频繁访问的变量
void registerVariableDemo(void) {
register int counter = 0;
for (register int i = 0; i < 1000000; i++) {
counter++;
}
printf("Counter: %d\n", counter);
// 不能对寄存器变量取地址
// int* p = &counter; // 错误
}