C 使用类对象宏是定义全局变量的好方法吗?
我的老师告诉我,预处理器命令#define是声明全局变量的方法。基本上我使用 将x声明为全局变量。现在,我习惯于做类似的事情来定义这类变量,建议我不要再这样做了:C 使用类对象宏是定义全局变量的好方法吗?,c,macros,global-variables,constants,c-preprocessor,C,Macros,Global Variables,Constants,C Preprocessor,我的老师告诉我,预处理器命令#define是声明全局变量的方法。基本上我使用 将x声明为全局变量。现在,我习惯于做类似的事情来定义这类变量,建议我不要再这样做了: #include <stdio.h> const int x = 3; int main(void){...}; 使用#define x 3和const int x=3,这段代码编译和运行时不会出现任何问题。现在,我肯定错过了一些东西,但我真的看不出有什么不同!有人能温和地告诉我问题的重点是什么吗?\define被用
#include <stdio.h>
const int x = 3;
int main(void){...};
使用#define x 3
和const int x=3,这段代码编译和运行时不会出现任何问题代码>。现在,我肯定错过了一些东西,但我真的看不出有什么不同!有人能温和地告诉我问题的重点是什么吗?\define
被用来创建一个常量,而不是一个变量,但现在不赞成这样做#define x 3
是一个预处理器指令,基本上意味着“将x
替换为3
源文件中的任意位置”。这就像在代码编辑器中使用“匹配整个单词”和“区分大小写”选项进行搜索和替换
另一方面,const
创建一个合法的标识符,包括地址、范围和所有内容。它可以像变量一样使用,即使使用&
(地址)运算符也是如此。它就是不能赋值。#define
用于创建常量,而不是变量,但现在不赞成这样做#define x 3
是一个预处理器指令,基本上意味着“将x
替换为3
源文件中的任意位置”。这就像在代码编辑器中使用“匹配整个单词”和“区分大小写”选项进行搜索和替换
另一方面,const
创建一个合法的标识符,包括地址、范围和所有内容。它可以像变量一样使用,即使使用&
(地址)运算符也是如此。这段代码的#define和Const value没有区别。但是,如果你正在编写一个性能关键代码,那么考虑一下,因为它使你的值全局化,它由编译器进行预处理,而const有正常的查找。
优点是#define会自动替换出现的每个名称。
缺点是,如果在代码中多次使用相同的名称,则会发生冲突。这段代码的#define和Const value没有区别。但是,如果你正在编写一个性能关键代码,那么考虑一下,因为它使你的值全局化,它由编译器进行预处理,而const有正常的查找。
优点是#define会自动替换出现的每个名称。
缺点是,如果在代码中多次使用相同的名称,则会发生冲突。\code>\define x 3
不会创建全局变量。@immibis它的作用是什么?它定义了类似宏的对象。类对象宏与全局变量不同。#define x 3
不创建全局变量。@immibis它的作用是什么?它定义类对象宏。类对象宏不同于全局变量。那么,这是否与代码样式更相关?@ClaudioCortese想象一下,在其他地方,您有一个for循环:for(int x=5;x<10;x++)printf(“%d\n”,x)代码>猜猜如果你使用#define会发生什么?不止这些。假设我写了#define x rand()
。我在代码中使用x
的任何地方,它都会被rand()
替换,并生成一个新的随机数。如果我改为使用const int x=rand()
,它只会计算rand()
一次,每次我使用x
,我都会得到相同的数字。@immibis你是对的,但是你可以用一种简单的方法避免这个错误,这不是一个真正的问题hence@ClaudioCortese简单的方法是什么?那么,这与代码的风格更相关吗?@ClaudioCortese想象一下,在其他地方,你有一个for循环:for(intx=5;x<10;x++)printf(“%d\n”,x)代码>猜猜如果你使用#define会发生什么?不止这些。假设我写了#define x rand()
。我在代码中使用x
的任何地方,它都会被rand()
替换,并生成一个新的随机数。如果我改为使用const int x=rand()
,它只会计算rand()
一次,每次我使用x
,我都会得到相同的数字。@immibis你是对的,但是你可以用一种简单的方法避免这个错误,这不是一个真正的问题hence@ClaudioCortese最简单的方法是什么?那就是“查找”可能这就是为什么我的老师说这是声明全局变量的最好方法variable@JohnSensebe等等,我错过什么了吗?使用const int比#define更优化吗?不,但是一个好的编译器会使const
与#define
一样高效。过去人们常说,由于答案中的原因,const
速度较慢,但今天的情况很少如此。另外,使用const
时,类型检查和调试会更容易。这种“查找”会被比完全糟糕的编译器更好的编译器优化掉。也许这就是为什么我的老师说这是声明全局variable@JohnSensebe等等,我错过什么了吗?使用const int比#define更优化吗?不,但是一个好的编译器会使const
与#define
一样高效。过去人们常说,由于答案中的原因,const
速度较慢,但今天的情况很少如此。另外,使用const
可以进行类型检查,并且调试更容易。
#include <stdio.h>
const int x = 3;
int main(void){...};
y = x * 3;