// .c ---------------------------------------------------------------------------
int g_global = 10;
int add(int a, int b)
{
return a + b;
}
// .c ---------------------------------------------------------------------------
#include <stdio.h>
// 声明
int add(int a, int b);
extern int g_global;
int main()
{
printf("%d\n", add(1, g_global));
return 0;
}
作用域与生命周期
作用域就近原则:程序在查找变量时,优先从当前作用域的局部变量开始并逐层向外查找
static 修饰的全局变量和函数,只能在本文件内部使用(修饰局部变量会将其生命周期变长)
内联可能不被编译器采纳,是否生成实现取决于链接(应避免依赖外部链接的 inline 定义)
c复制代码
// main.h ---------------------------------------------------------------------------
#pragma once
#include <stdio.h>
// 唯一跨平台安全的 inline(C99)写法
static inline int min(int a, int b)
{
// 生命周期延长
static int sum = 0;
sum++;
printf("sum: %d\n", sum);
return a < b ? a : b;
}
// .c ---------------------------------------------------------------------------
#include "main.h"
// 全局变量
int global = 1;
int main()
{
// 局部变量
int global = 10;
// 作用域就近原则
printf("%d\n", global);
{
printf("%d\n", global);
// 重新声明外部变量(不是绕过局部)
extern int global;
printf("%d\n", global);
}
// 内联函数
printf("%d\n", min(6, 2));
printf("%d\n", min(min(1, 2), 5));
return 0;
}
可变函数参数
函数声明时最后一个固定参数后加 ... 表示可变参数(va_list 类型保存参数列表)
调用者必须提供足够信息(如参数个数或终止标记)让函数知道何时停止读取参数
c复制代码
#include <stdio.h>
#include <stdarg.h>
// 可变参数不做类型检查,传错类型是未定义行为
int sum(int count, ...)
{
// 定义与初始化
va_list args;
va_start(args, count);
int total = 0;
for (int i = 0; i < count; i++)
{
// 获取可变参数
total += va_arg(args, int);
}
// 清理资源
va_end(args);
return total;
}
int main()
{
printf("%d\n", sum(3, 10, 20, 30));
return 0;
}