1、#define 是预处理器宏
#define
是一个预处理指令,用于在编译之前进行文本替换。它没有类型,不分配内存,直接由预处理器将所有出现的宏替换成对应的值或表达式。
#include <stdio.h>
#define PI 3.14159 // 定义圆周率宏
int main() {
double radius = 5.0;
double area = PI * radius * radius; // 计算面积
double circumference = 2 * PI * radius; // 计算周长
printf("半径: %.2f\n", radius);
printf("圆的面积: %.2f\n", area);
printf("圆的周长: %.2f\n", circumference);
return 0;
}
2、static const
static const
定义了一个具有明确类型的常量,这个常量在编译时进行处理,具有固定的存储位置,并且其作用域可以限定在声明它的文件内。
#include <iostream>
using namespace std;
static const double PI = 3.14159;
double calculateCircleArea(double radius) {
return PI * radius * radius;
}
int main() {
double radius = 5.0;
cout << "半径为 " << radius << " 的圆面积为: " << calculateCircleArea(radius) << endl;
return 0;
}
3、static const 和 #define 区别
#define
是预处理指令,在编译前进行简单的文本替换,不占内存,无法定义类型,调试时无类型信息;而 static const
是具有类型的常量,编译器在编译阶段处理,具备作用域和类型检查,存储在只读存储区(只读段),更安全、更规范,适用于复杂类型和局部作用域的常量定义。
#include <stdio.h>
#define PI 3.14159 // 预处理宏,无类型,仅文本替换
static const double pi = 3.14159; // 具有类型的常量,编译时检查,存储在只读区
int main() {
double r = 2.0;
// #define宏,纯文本替换,无类型检查
double area_macro = PI * r * r;
// static const常量,有类型,参与编译期检查
double area_const = pi * r * r;
printf("Area using #define macro: %.2f\n", area_macro);
printf("Area using static const: %.2f\n", area_const);
// 类型安全示例
// printf("%d\n", PI); // ⚠️ 无警告,但逻辑有误,PI是double意义,却按int打印
// printf("%d\n", pi); // ⚠️ 报错或警告,pi是double类型,int格式不匹配
return 0;
}