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]

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值