我认为不需要使用宏来定义某些东西,比如下面的例子:
#define TELEPHONE 443 //why use this
int telephone = 443; //when same job is done by a regular variable
为什么任何人都会使用宏来定义(在C语言中声明变量)?如上面的场景?
答案 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的注释相同。