0

I don't see the need of using macro to define something , say in below example:

#define TELEPHONE 443 //why use this

int telephone = 443; //when same job is done by a regular variable

why would any one use macro for defining (declaring variable in C language) ? as in above scenario?

4

4 回答 4

1

为什么有人会使用宏来定义(用 C 语言声明变量)?

宏没有定义变量,它定义了一个常量。TELEPHONE编译器无法将使用 d的C 程序#define与包含硬编码 value 的程序区分开来443

int telephone变量不同,TELEPHONE宏不能在运行时更改,并且没有地址。

最后,可以在调用编译器时在命令行上为宏提供值——这在处理 C 变量时是不可能做到的。#define TELEPHONE 443您可以在命令行上传递值,而不是定义,如下所示:

gcc -DTELEPHONE=443 myprog.c
于 2013-09-22T03:31:51.340 回答
1

使用变量会占用最终图像中的空间,这可能不是必需的或不需要的(例如在嵌入式应用程序中),而定义则由编译器(预处理器)严格处理。

于 2013-09-22T03:32:47.710 回答
1

有几种情况下宏更合适。我的头顶是:

1.定义一个常数:

#define PI 3.1415926

2.用作常量表达式。

#define BUFSIZE 1024

稍后您可以使用

int buffer[BUFSIZE];

const int bufsize = 1024;即使您使用(不使用可变长度数组)也无法完成这项工作


编辑

为了澄清const注释中的使用,在此代码中:

int main()
{
    const int x = 5;
    int array[x]; 
    return 0;
}

array实际上是一个变长数组,用 编译gcc test.c -std=c89 -pedantic,会产生警告:

warning: ISO C90 forbids variable-size array `array'

问题是,constC 中的变量不是常量表达式,这正是我#define在这种情况下使用的目的。这是 C 和 C++ 之间的区别之一。

参考:C 常见问题

于 2013-09-22T03:35:36.857 回答
0

dasblinkenlight 几乎涵盖了它,但我只想澄清他们所说的一些事情,宏并没有真正定义常量,你可以使用 const 修饰符来做到这一点,而且你应该大部分时间都在使用它。宏定义了替换文本,它唯一知道的关于您正在编写的语言的就是它对空格的使用。所以对于宏你可以做这样的事情

#define CODE_SNIPPET 10; i++ ) printf( "Hello %d\n"

for( int i = 0; i < CODE_SNIPPET , i );

在传递给解析器之前,预处理器将其转换为

for( int i = 0; i < 10; i++ ) printf( "Hello %d\n" , i );

这是非常强大的,但显然可以滥用。我很少将宏用于常量,而是将值定义为 .c 文件中的 const ,然后在标头中将其声明为 extern

const int kAnswerToEveryThing = 42;    // .c file

extern const int kAnswerToEveryThing;        // .h file

我有一个项目我经常使用宏,这是在 Objective-C 而不是 c 中,但是宏系统是相同的,我已经定义了扩展为类方法的宏,这些方法将元数据添加到我要使用的类中库,它的功能与 Java 的注解相同。

于 2013-09-22T03:58:08.613 回答