【问题标题】:What is the difference between global variables and #define in c全局变量和c中的#define有什么区别
【发布时间】:2015-05-02 09:54:57
【问题描述】:

为什么有2个机会:

  1. 全局变量
  2. #define 的符号常量?

所以我知道#define 做了什么,但我不知道使用上有什么区别。 我必须有哪种情况才能在正确的机会上决定自己?有什么机会可以做另一个不能做的事情?我希望我能澄清我的意思。

【问题讨论】:

  • 全局变量可以从任何地方访问和编辑。 #define 常量不能编辑,只能读取。它与线程安全和函数重入有关。
  • "我知道#define 是做什么的" 确定吗? ;-) 但是,阅读此gcc.gnu.org/onlinedocs/cpp 可能会帮助您获得启发。
  • 一个global变量是一个变量,你可以改变它的值,除非你把它变成一个const#define是固定值。根本无法更改。
  • @GAURAVVERMA:它甚至不一定是“价值”。
  • #define 由预处理器处理。它只是某种意义上的纯文本替换。如果涉及您的#define 指令的错误,编译器将无法弄清楚,您最终会收到“神秘”的错误消息。预处理器指令有它们的位置,但有时最好坚持使用“const globals

标签: c global-variables c-preprocessor


【解决方案1】:

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

基本上,在底层,一个变量存储在 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

【讨论】:

  • 因此,常量全局变量和宏的唯一区别是内存(常量全局变量存储在内存中而宏不存储),不是吗?
  • @Clock_9 是的,这是不同之处之一,但不是唯一的。你不能在序数变量中存储一段代码,你不能用变量做一些系统特定的东西。
  • @Clock_9 至于定义:如果您定义类似#define PRINT_THE_HELLO_DEFINES printf("hello defines!\n");void main(){ PRINT_THE_HELLO_DEFINES } 的内容,那么您的代码将被替换为:void main(){ printf("hello defines!\n"); }。所以,定义是关于替换东西。
【解决方案2】:

考虑这个小例子

#define num 5
int number = 5;

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

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

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

所以,没办法

num = 6;

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

【讨论】:

  • 可以重新定义宏(在使用 #undef 预处理器指令未定义它们之后)。
【解决方案3】:

可以从任何地方访问和编辑全局变量。 #define 常量不能编辑,只能读取。

例子:

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

  • 我们使用一个全局变量来计算一个函数执行了多少操作,并且这个值也可以被其他函数读取。

没有必要将错误作为一个全局变量,因为它不应该被编辑并且你不能使用#define x作为计数器。

【讨论】:

    【解决方案4】:

    #define 声明在代码之上,即在类声明之前。它用于定义(顾名思义)一个可以读取但不能更改的常量。

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

    【讨论】:

    • C 中没有类。
    • (不知道为什么这条评论被删除了)像#define 这样的预处理器指令可以放在文件的每一行,该文件将被提供给C 预处理器.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-23
    • 2016-01-17
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    相关资源
    最近更新 更多