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

时间:2015-05-02 09:54:58

标签: c global-variables c-preprocessor

是什么原因有2个机会:

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

4 个答案:

答案 0 :(得分:6)

考虑这个小例子

#define num 5
int number = 5;

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

一个重要区别是num未存储在内存中,num只是5的替代,但number使用内存。

此外,宏是预处理器指令,它们的值不能像变量那样改变。

所以,没有做

num = 6;

稍后在代码中。您必须使用#undef取消定义它并再次定义它以更改值。

答案 1 :(得分:6)

嗯,可以从任何地方编辑全局变量。

基本上,在低级别,变量存储在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;

并且,在大多数情况下,定义用于设置某些特定于操作系统或特定于硬件的值。它是一个非常强大的东西,因为它让你有机会在编译步骤中动态地改变事物。例如:

// 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 :(得分:2)

可以从任何地方访问和编辑全局变量。 #define常量无法编辑,只需阅读。

示例:

  • 我们使用#define ERROR 666为整个程序的错误定义程序员预编译时间常量。

  • 我们使用全局变量来计算函数执行的操作次数,并且其他函数也可以读取该值。

将错误作为全局变量是没有意义的,因为它不应该被编辑,你不能使用#define x作为计数器。

答案 3 :(得分:-4)

#define在代码之上声明,它意味着在声明类之前。它用于定义(如名称所示)一个常量,可以读取但不能更改。

可以在代码上全局访问全局变量,同时更改。