gpt4 book ai didi

c - #define的逻辑(microchip xc8编译器)

转载 作者:太空宇宙 更新时间:2023-11-04 02:09:31 27 4
gpt4 key购买 nike

我刚开始学习用于 pic 编程的 C,我正在查看其他人的代码和编译器提供的包含文件,尤其是基础代码(xc.h、pic.h、pic特定的标题...),我看到了这个结构(它在 pic.h 中找到)

#define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000.0)))

它自然有效,但我无法理解它的基本逻辑。据我了解,#define 是一个“别名制造者”,您告诉编译器每次在程序中遇到代码 X 时用 Y 替换它。但仅此而已,简单的替换。在这里,我看到一个变量、一个输入或一个参数 (x),传递给了替代项,但我不知道如何传递!如果是我的话,我会为此创建一个函数,而且如果我发现一段代码中不必要地创建了延迟宏(可能是因为作者不知道 native _delay,或者因为我正在从另一个编译器移植代码)我可以简单地重新定义(假设的!)“等待(200)”以指向 native “_delay(200)”。现在的问题是有人可以向我解释这个结构是如何工作的吗? X 甚至都没有声明,难道它不会被视为一个简单的字符来替换而不是要传递的值吗?这个构造是否等效?

#define wait(x) __delay_us(unsigned long x)

最佳答案

__delay_us(x) 这里是一个 function-like macro .类似函数的宏允许更多的动态常量(很好的悖论,嗯)。它就像一个普通的宏一样工作,但是你给它们一个参数。然后将参数逐字代入宏,然后再代入代码。例如:

float y = 12000000.0;
unsigned long delay = __delay_us(y);

将扩展为:

float y = 12000000.0;
unsigned long delay = _delay((unsigned long)((y)*(_XTAL_FREQ/4000000.0)));

(注意 y 而不是 x)

定义您自己的类函数宏时要非常小心:

  1. 参数按字面替换,确保它们在宏体中只出现一次。如果有人提供函数调用作为参数,它可能会产生不需要的结果。
  2. 如您所见,根本没有进行类型检查,因为宏中不存在类型。

更多陷阱:http://gcc.gnu.org/onlinedocs/cpp/Macro-Pitfalls.html (虽然你没有使用 GCC,它可能仍然适用)

关于c - #define的逻辑(microchip xc8编译器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16114389/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com