全局变量和c中的#define有什么区别
What is the difference between global variables and #define in c
为什么会有 2 个机会:
- 全局变量
- 符号常量
#define
?
所以我知道 #define
的作用,但我不知道在使用上有什么区别。
我必须有哪种情况才能决定自己的正确机会?什么机会之一能够做另一个不能做的事情?我希望我能澄清我的意思。
可以从任何地方访问和编辑全局变量。 #define常量不可编辑,只读。
示例:
我们使用#define ERROR 666
为整个程序的错误定义一个程序员预编译时间常量。
我们使用一个全局变量来计算一个函数执行了多少次操作,这个值也可以被其他函数读取。
将错误作为全局变量是没有意义的,因为它不应该被编辑并且你不能使用 #define x
作为计数器。
#define
声明在代码之上,也就是说在class声明之前。它的作用是定义(顾名思义)一个常量,可以读取但不能更改。
一个全局变量可以在代码上全局访问,同时改变。
考虑这个小例子
#define num 5
int number = 5;
num
是宏,number
是全局变量。
一个重要的区别是num
不存储在内存中,num
只是5的替代,但number
使用内存。
此外,宏是预处理器指令,它们的值不能像变量一样更改。
所以,不做
num = 6;
稍后在代码中。您将不得不使用 #undef
取消定义并再次定义它以更改值。
嗯,可以从任何地方编辑全局变量。
基本上,在低级别,变量存储在 RAM 内存中并在启动应用程序后创建,它在 RAM 中始终有一个地址。定义只是宏,您的编译器将在编译步骤中用它的值替换您的定义名称。
#define
无法编辑,只是一个宏。而且 #define
不仅仅是关于值,您可以定义几乎所有您想要的东西,例如:
// Defining a constant
#define PI 3.14
// Defining an expression
#define MIN(x,y) ((x)<(y))?(x):(y)
// Defining a piece of code
#define STOP_TIMER \
clock_gettime(CLOCK_REALTIME, &__t1); \
__lasttime = \
(double) (__t1.tv_sec - __t0.tv_sec) + \
(double) (__t1.tv_nsec - __t0.tv_nsec) / 1000000000.0;
而且,在大多数情况下,定义用于设置一些 OS 特定或硬件特定的值。这是一件非常强大的事情,因为它让您有机会在编译步骤中动态更改内容。例如:
// Example with OS
#ifdef __linux__
#define WELCOME_STRING "welcome to Linux!"
#else
#define WELCOME_STRING "welcome to Windows!"
#endif
// Example with hardware
#if __x86_64__ || __ppc64__
#define USING_64BIT
#else
#define USING_NOT64BIT
#endif
为什么会有 2 个机会:
- 全局变量
- 符号常量
#define
?
所以我知道 #define
的作用,但我不知道在使用上有什么区别。
我必须有哪种情况才能决定自己的正确机会?什么机会之一能够做另一个不能做的事情?我希望我能澄清我的意思。
可以从任何地方访问和编辑全局变量。 #define常量不可编辑,只读。
示例:
我们使用
#define ERROR 666
为整个程序的错误定义一个程序员预编译时间常量。我们使用一个全局变量来计算一个函数执行了多少次操作,这个值也可以被其他函数读取。
将错误作为全局变量是没有意义的,因为它不应该被编辑并且你不能使用 #define x
作为计数器。
#define
声明在代码之上,也就是说在class声明之前。它的作用是定义(顾名思义)一个常量,可以读取但不能更改。
一个全局变量可以在代码上全局访问,同时改变。
考虑这个小例子
#define num 5
int number = 5;
num
是宏,number
是全局变量。
一个重要的区别是num
不存储在内存中,num
只是5的替代,但number
使用内存。
此外,宏是预处理器指令,它们的值不能像变量一样更改。
所以,不做
num = 6;
稍后在代码中。您将不得不使用 #undef
取消定义并再次定义它以更改值。
嗯,可以从任何地方编辑全局变量。
基本上,在低级别,变量存储在 RAM 内存中并在启动应用程序后创建,它在 RAM 中始终有一个地址。定义只是宏,您的编译器将在编译步骤中用它的值替换您的定义名称。
#define
无法编辑,只是一个宏。而且 #define
不仅仅是关于值,您可以定义几乎所有您想要的东西,例如:
// Defining a constant
#define PI 3.14
// Defining an expression
#define MIN(x,y) ((x)<(y))?(x):(y)
// Defining a piece of code
#define STOP_TIMER \
clock_gettime(CLOCK_REALTIME, &__t1); \
__lasttime = \
(double) (__t1.tv_sec - __t0.tv_sec) + \
(double) (__t1.tv_nsec - __t0.tv_nsec) / 1000000000.0;
而且,在大多数情况下,定义用于设置一些 OS 特定或硬件特定的值。这是一件非常强大的事情,因为它让您有机会在编译步骤中动态更改内容。例如:
// Example with OS
#ifdef __linux__
#define WELCOME_STRING "welcome to Linux!"
#else
#define WELCOME_STRING "welcome to Windows!"
#endif
// Example with hardware
#if __x86_64__ || __ppc64__
#define USING_64BIT
#else
#define USING_NOT64BIT
#endif