为什么在变量完成相同工作时使用宏?在C语言?

时间:2013-09-22 03:26:19

标签: c macros

我认为不需要使用宏来定义某些东西,比如下面的例子:

#define TELEPHONE 443 //why use this

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

为什么任何人都会使用宏来定义(在C语言中声明变量)?如上面的场景?

4 个答案:

答案 0 :(得分:1)

  

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

宏没有定义变量,它定义了一个常量。使用TELEPHONE的{​​{1}}的C程序与包含硬编码值#define的程序的编译器无法区分。

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

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

#define TELEPHONE 443

答案 1 :(得分:1)

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

答案 2 :(得分: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'

问题是,C中的const变量不是常量表达式,这正是我在这种情况下使用#define的观点。这是C和C ++之间的差异之一。

参考:C FAQ

答案 3 :(得分: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的注释相同。