我将补充已经说过的内容。
因为宏适用于文本替换,它们允许您做非常有用的事情,而这些事情是使用函数无法做到的。
以下是宏真正有用的几种情况:
/* Get the number of elements in array 'A'. */
#define ARRAY_LENGTH(A) (sizeof(A) / sizeof(A[0]))
这是一个非常流行且经常使用的宏。例如,当您需要遍历数组时,这非常方便。
int main(void)
{
int a[] = {1, 2, 3, 4, 5};
int i;
for (i = 0; i < ARRAY_LENGTH(a); ++i) {
printf("a[%d] = %d\n", i, a[i]);
}
return 0;
}
在这里,如果另一个程序员在声明中再添加五个元素并不重要a。for-loop 将始终遍历所有元素。
C 库用于比较内存和字符串的函数很难使用。
你写:
char *str = "Hello, world!";
if (strcmp(str, "Hello, world!") == 0) {
/* ... */
}
或者
char *str = "Hello, world!";
if (!strcmp(str, "Hello, world!")) {
/* ... */
}
检查是否str指向"Hello, world". 我个人认为这两种解决方案看起来都非常丑陋和令人困惑(尤其是!strcmp(...))。
这是一些人(包括我)在需要使用strcmp/比较字符串或内存时使用的两个简洁的宏memcmp:
/* Compare strings */
#define STRCMP(A, o, B) (strcmp((A), (B)) o 0)
/* Compare memory */
#define MEMCMP(A, o, B) (memcmp((A), (B)) o 0)
现在您可以编写如下代码:
char *str = "Hello, world!";
if (STRCMP(str, ==, "Hello, world!")) {
/* ... */
}
这里的意图更清楚了!
这些是宏用于功能无法完成的事情的情况。宏不应该用来替换函数,但它们还有其他很好的用途。