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; }