学习C语言中宏的建议

学习C语言中宏的建议,c,macros,C,Macros,我修过一门关于C语言的编程语言的本科课程。然而,我并没有开始在一家嵌入式系统公司工作,我看到C语言中经常使用大量宏 请分享一些链接,从那里我可以了解更多有关宏的信息 我有K&R第二版,但我觉得他们的风格太简洁了。有更多示例的东西对我来说会更好。这里有一个关于C预处理器的两部分教程,名为“ 使用IAR系统“预处理”的提示和技巧: 您可以查看以下链接: 大部分技巧你都得自己学会。如果您可以发布一些您不理解的宏,我们可以帮助您解决这些问题。使用宏非常简单: #define MACRO_F

我修过一门关于C语言的编程语言的本科课程。然而,我并没有开始在一家嵌入式系统公司工作,我看到C语言中经常使用大量宏

请分享一些链接,从那里我可以了解更多有关宏的信息


我有K&R第二版,但我觉得他们的风格太简洁了。有更多示例的东西对我来说会更好。

这里有一个关于C预处理器的两部分教程,名为“ 使用IAR系统“预处理”的提示和技巧:


您可以查看以下链接:


大部分技巧你都得自己学会。如果您可以发布一些您不理解的宏,我们可以帮助您解决这些问题。

使用宏非常简单:

#define MACRO_FUNCTION(par1, par2) (par1 * par2)
int product = MACRO_FUNCTION(4 ,5);

这是一个宏函数计算乘积的示例。请注意,宏未进行类型检查。它们只是在编译时被替换。因此,这取决于您使用正确的类型。

老实说,您现在应该将宏的使用限制为非常简单的定义

换句话说,不要浪费时间用宏来制作复杂的函数

在过去,它们往往有三个主要用途:

  • 预编译器要使用的简单定义,如
    #define use_DEBUG
    #ifdef use_DEBUG
    。总的来说,它们在可移植代码中仍然非常有价值

  • 快速“内联”函数,如
    #定义SQR(x)((x)*(x))
    ,现在更适合于真正的内联函数。宏版本有许多问题,其中之一是
    i=7;j=SQR(i++)不一定会达到您的期望

  • 预处理器枚举,如
    #define ok 0
    #define ERR_NOMEM 1
    等-这些最好作为实际枚举来完成-因为宏版本是基本的替换,所以调试信息中往往没有符号


可能太明显了,但是关于C预处理器的wiki文章实际上非常好而且详细:

这是相当稀少的。也就是说,您应该只将它们用于:常量 定义(代码中不应出现幻数),简单内联 函数(例如返回bool值的函数),基本上就是这样。 请记住,即使内联函数为您节省了一些处理器周期, 它们通过膨胀代码和阻止所述函数的调试来弥补。
希望这有助于回答您的问题

此外,它们也被逐字替换。示例
#定义平方(x)(x*x)
,然后
SQUARE(a++)
将增量
a
两次。不,运行时不会替换宏。它们在编译时被替换,在非常早期的阶段。还要注意的是,由于它们是用上面的定义逐字替换的,
宏函数(x+1,y)
将产生
x+y
@Christopher Creutzig:你说得对,谢谢。。我把答案写得太快了。当然,它们在编译时会被替换。我几乎从未使用过宏。我需要理解现有代码中已经存在的复杂代码。@user714652:理解它们的最好方法是在这里敲三到四个,这样我们就可以解释它们了。通过这种方式,你将比阅读长篇大部头书更快地接受教育。这里有一些人实际上是为了帮助你而摔倒了:-)还有一些人。。。多态性是宏的一个相当常见且难以替代的方面(sans C++)。隐式提供
\uuuuuuuuu文件
和/或
\uuuuu行
参数来记录日志是使用它们的另一个常见理由。非类型化替换、字符串连接、字符串化和标识符构造是其他应用程序。从那里你会得到很多
Hello,
As far as my knowledge goes the use of macro defs in embedded systems should