首页 > 代码库 > 为什么很多人使用#define而不是const定义常量

为什么很多人使用#define而不是const定义常量

众所周知,C语言一开始只有#define,C程序员用#define定义符号常量。但后来ANSI C加入了const限定符,而const应该比#define更好,为什么现在的C程序员还在大量使用#define来定义常量呢?

 

这并不是我没有根据地乱说的。这样的例子有很多,例如<limits.h>,例如Windows API,例如OpenGL……

 

<limits.h>是C标准头文件,发明C语言的人为什么不知道const吗?

Windows是Microsoft开发的,难道Microsoft的代码很差劲?

开发OpenGL的难道写的代码也很烂吗?

 

太奇怪了吧!因此,肯定是有什么特殊原因让他们使用#define……

 

曾今我在百度上用中文查这个问题,发现根本查不到;昨天我Google了“why use #define instead of const”,才在stackoverflow上找到了一个同样的问题:

 

Why do most C developers use define instead of const?

 

于是我阅读了这个问题的答案,然后挑选出一些答案,翻译出来。下面就是一些回答的原文和翻译(稍有修改),包括回答者的名字我也列出来了~

 

1. Bart van Ingen Schenau

 

There is a very solid reason for this: const in C does not mean something is constant. It just means a variable is read-only.

In places where the compiler requires a true constant (such as for array sizes for non-VLA arrays), using a const variable, such as fieldWidth is just not possible.

 

这有个很可靠的原因:const在C中不表示一个变量是常量。const只表示一个变量是只读的。

在编译器需要一个真正的常量的情况下(例如不可变长数组的大小),使用const变量,例如fieldWidth是不可能的。

 

2. Vovanium

 

They‘re different.

const is just a qualifier, which says that a variable cannot be changed at runtime. But all other features of the variable persist: it has allocated storage, and this storage may be addressed. So code does not just treat it as a literal, but refers to the variable by accessing the specified memory location (except if it is static const, then it can be optimized away), and loading its value at runtime. And as a const variable has allocated storage, if you add it to a header and include it in several C sources, you‘ll get a "multiple symbol definition" linkage error unless you mark it as extern. And in this case the compiler can‘t optimize code against its actual value (unless global optimization is on).

#define simply substitutes a name with its value. Furthermore, a #define‘d constant may be used in the preprocessor: you can use it with #ifdef to do conditional compilation based on its value, or use the stringizing operator # to get a string with its value. And as the compiler knows its value at compile time it may optimize code based on that value.

For example:

#define SCALE 1

...

scaled_x = x * SCALE;
When SCALE is defined as 1 the compiler can eliminate the multiplication as it knows that x * 1 == x, but if SCALE is an (extern) const, it will need to generate code to fetch the value and perform the multiplication because the value will not be known until the linking stage. (extern is needed to use the constant from several source files.)

A closer equivalent to using #define is using enumerations:

enum dummy_enum {
constant_value = http://www.mamicode.com/10010
};
But this is restricted to integer values and doesn‘t have advantages of #define, so it is not widely used.

const is useful when you need to import a constant value from some library where it was compiled in. Or if it is used with pointers. Or if it is an array of constant values accessed through a variable index value. Otherwise, const has no advantages over #define.

 

它们不一样。

 

(TO BE CONTINUED)

为什么很多人使用#define而不是const定义常量