首页 > 解决方案 > #define 与 const 全局

问题描述

执行以下操作有什么区别:

const int var1=100;
#define   var2 200

int main(int argc, char* argv[]) 
{

}

var2占用地址/值还是被编译器替换?什么时候会使用一个而不是另一个?

标签: cc-preprocessor

解决方案


在您的示例中,var2只是要被 C 预处理器替换的文本。在程序甚至编译之前,预处理器解析源文件并用扩展文本替换任何出现的“var2”(不在注释或字符串文字中),在您的示例中是 number 200。它不占用内存空间,因为编译器甚至看不到“var2”,它只看到数字常量文字“200”。

var1但是,它是一个不可修改的左值(即它确实存在于内存中)。当您使用关键字限定变量定义时const,编译器将在程序尝试修改变量时抛出错误。

使用宏#define var2 200确实具有性能优势 - 即您的程序将占用更少的内存(因为堆栈上的变量更少)并且您的程序可能运行得更快(可能可以忽略不计)(因为处理器不必总是加载值从记忆里)。

但是,宏可能容易出错,并且除了在性能最密集的应用程序中,使用const变量的保护措施通常超过成本。尽管如此,今天的编译器非常聪明,可以对const变量进行优化,以进一步降低性能成本。


推荐阅读