Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用类对象宏是定义全局变量的好方法吗?_C_Macros_Global Variables_Constants_C Preprocessor - Fatal编程技术网

C 使用类对象宏是定义全局变量的好方法吗?

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被用

我的老师告诉我,预处理器命令#define是声明全局变量的方法。基本上我使用

x声明为全局变量。现在,我习惯于做类似的事情来定义这类变量,建议我不要再这样做了:

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