C 宏产生意外行为

标签 c macros c-preprocessor precompile pre-compilation

我正在尝试使用宏轻松更改我的头文件。我正在调试我的代码,似乎这些宏没有做它们应该做的事情。有人能告诉我如何达到以下效果吗? LED_ID_AMS等

#define LED_NUMBER                  (2)
#define LED_ID_X                    (0)
#define LED_ID_Y                    (1)
#define LED_PIN_X                   (0)
#define LED_PIN_Y                   (3)
#define LED_PORT_X                  (PORTE)
#define LED_PORT_Y                  (PORTG)
#define LED_DD_X                    (DDRE)
#define LED_DD_Y                    (DDRG)
#define LED_PORT(LED_ID_X)          (LED_PORT_X)
#define LED_PORT(LED_ID_Y)          (LED_PORT_Y)
#define LED_PIN(LED_ID_X)           (LED_PIN_X)
#define LED_PIN(LED_ID_Y)           (LED_PIN_Y)
#define LED_DD(LED_ID_X)            (LED_DD_X)
#define LED_DD(LED_ID_Y)            (LED_DD_Y)

我想要实现什么目标?

我正在尝试这样做,以便我可以像这样循环访问端口初始化:

for(i=0;i<LED_NUMBER;i++){
    /* set data direction to output*/
    LED_DD(i)|=((0x01)<<LED_PIN(i));
    /* turn on led */
    LED_PORT(i)|=((0x01)<<LED_PIN(i));
}

最佳答案

以后你会后悔使用了太多的宏。实际上,您已经后悔了,因为它们不起作用,而且作为宏,它们非常难以调试。

简单说几点:

  • 您的 LED_PIN(i) 表达式始终扩展为 0
  • 您的 LED_PORT(i) 表达式始终会扩展为 PORTE,无论它是什么

例如,LED_PIN(LED_ID_X) 扩展为 LED_PIN_X。请注意,根本没有使用宏参数LED_ID_X。相反,LED_PIN_X 只是扩展为 0

关于C 宏产生意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22439987/

相关文章:

php - 我可以强制我的 PHP C 扩展在编译时链接 pthread 吗?

netbeans - 您在Netbeans中创建了哪些有用的宏?

c - 将源代码多次传递到 cpp

c - 从 .c 文件生成 .i 文件

c - .c 中的操作系统进程

c++ - 错误 LNK1561 : entry point must be defined

c - 宏在我的 C 代码中与整数和字符有何不同

c++ - CPP : avoiding macro expansion of a macro function parameter

c - 在编译时获取纪元时间

c - 很难在我的 C 程序中调试我的链表