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

Clo*_*k_9 9 c global-variables c-preprocessor

是什么原因有2个机会:

  1. 全局变量
  2. 象征常数与#define

所以我知道是什么#define,但我不知道使用的区别是什么.我必须拥有哪种情况,因此我能够在正确的机会中做出自己的决定?什么是能够做到另一个没有的机会?我希望我能澄清一下我的意思.

Fal*_*nUA 8

那么,可以从任何地方编辑全局变量.

基本上,在低级别中,变量存储在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;
Run Code Online (Sandbox Code Playgroud)

并且,在大多数情况下,定义用于设置某些特定于操作系统或特定于硬件的值.这是一个非常强大的功能,因为它为您提供了在编译步骤中动态更改内容的机会.例如:

// 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
Run Code Online (Sandbox Code Playgroud)


Aru*_*A S 6

考虑这个小例子

#define num 5
int number = 5;
Run Code Online (Sandbox Code Playgroud)

num是一个宏,number是一个全局变量.

一个重要的区别是num没有存储在内存中,num只是替代5,而是number使用内存.

此外,宏是预处理程序指令,它们的值不能像变量一样更改.

所以,没有做

num = 6;
Run Code Online (Sandbox Code Playgroud)

稍后在代码中.您将不得不使用#undef它来取消定义它并再次定义它来更改值.