C语言使用宏所遇到的一点问题
个人感觉比较有意思,所以就记下来了。
关于宏的使用原则,第一条就是永远都不要使用宏。
但是就实际情况而言,除非是极小的程序,否则不使用宏是不可能的。
关于使用宏的好处有:
(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]
这本身是很简单的问题,但却有时候不小心就带来了问题。
所以将这鲜活的案例总结下来,希望自己能够做的更好;而不是把时间浪费在发生问题之后的调试上。
补充:软件开发 , C语言 ,