现在的位置: 首页 > 综合 > 正文

C语言使用宏所遇到的一点问题

2014年05月24日 ⁄ 综合 ⁄ 共 995字 ⁄ 字号 评论关闭

个人感觉比较有意思,所以就记下来了。
关于宏的使用原则,第一条就是永远都不要使用宏。
但是就实际情况而言,除非是极小的程序,否则不使用宏是不可能的。

关于使用宏的好处有:
(1)在程序编译期间即可根据需要按需配置程序功能;
(2)定义一些有意义的常量宏有助于增加代码的可读性,以及减小代码维护的代价。

宏会在预编译阶段被替换掉。
要小心的是,一定要在使用宏之前就将宏定义好。

与宏比较相似的一个东西就是inline函数,inline函数的优点有:
(1)在编译阶段会进行类型检查;
(2)在编译阶段会直接将inline函数代码展开到调用处,所以不存在函数调用的开销。

inline函数通常适合应用于那些短小的函数中,否则可能会造成程序的size变大。

本人遇到的一个情况就是,由于文件比较大,所以一不小心被注意导致宏定义没有放到
所有使用宏的地方的最前面,从而造成运行程序时出现不预期的结果。

测试代码如下:
#include <stdio.h>

#ifdef ENABLE_FEATURE
int i_g_value = 1;
#else
int i_g_value = 2;
#endif

#define ENABLE_FEATURE

int main(int argc, char* argv[])
{
    printf("\ni_g_value=%d\n", i_g_value);
    return 0;
}

[sh] gcc -o macro_test_main macro_test_main.c
[sh] ./macro_test_main

i_g_value=2
[sh]
这显然不是预期的结果。

于是修改程序如下:
#include <stdio.h>

#define ENABLE_FEATURE

#ifdef ENABLE_FEATURE
int i_g_value = 1;
#else
int i_g_value = 2;
#endif

int main(int argc, char* argv[])
{
    printf("\ni_g_value=%d\n", i_g_value);
    return 0;
}

[sh] gcc -o macro_test_main macro_test_main.c
[sh] ./macro_test_main

i_g_value=1
[sh]

这本身是很简单的问题,但却有时候不小心就带来了问题。
所以将这鲜活的案例总结下来,希望自己能够做的更好;而不是把时间浪费在发生问题之后的调试上。

抱歉!评论已关闭.