全局变量和c中的#define有什么区别

What is the difference between global variables and #define in c

为什么会有 2 个机会:

  1. 全局变量
  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