c - 在c程序中使用宏

标签 c macros

我有这个带有宏的愚蠢程序,但我不知道失败的原因是什么:

#include <stdio.h>
#include <stdlib.h>

#define READ_RX  (1 << 1)
#define WRITE_RX (1 << 2)
#define READ_TX  (1 << 3)
#define WRITE_TX (1 << 4)

#define READ_COMMAND(num) (num == 0) ? (READ_RX) : (READ_TX)
#define WRITE_COMMAND(num) (num == 0) ? (WRITE_RX) : (WRITE_TX)

int main(int argc, char **argv)
{

    printf("[DEBUG] 0x%04X\n", (READ_COMMAND(0)) | (WRITE_COMMAND(0))); //works fine
    printf("[DEBUG] 0x%04X\n", READ_COMMAND(0) | WRITE_COMMAND(0)); //doesn't work

    return 0;
}

结果:

$ ./test
[DEBUG] 0x0006 -> works fine
[DEBUG] 0x0002 -> doesn't work

有谁知道是什么问题吗?

最好的问候。

最佳答案

宏只是文本替换它们的意思。 即

(READ_COMMAND(0)) | (WRITE_COMMAND(0))

成为

((num == 0) ? (READ_RX) : (READ_TX)) | ((num == 0) ? (READ_RX) : (READ_TX))

鉴于

READ_COMMAND(0) | WRITE_COMMAND(0)

成为

(num == 0) ? (READ_RX) : (READ_TX) | (num == 0) ? (READ_RX) : (READ_TX)

现在使用优先规则,你可以看到,这和

(num == 0) ? (READ_RX) : ( (READ_TX) | (num == 0) ? (READ_RX) : (READ_TX) )

关于c - 在c程序中使用宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42725786/

相关文章:

C 结构体指针数组 vs 结构体指针 malloc

c - OpenMP 中可重用的私有(private)动态分配数组

c - 适当的 C 预处理器宏空操作

以 Shell 模式启动并运行命令的 Emacs 宏

linux - 在 Linux 内核中, header 包含错误

CFNumberFormatterCreateStringWithNumber int 问题

c - c中是否有安全的 "mkdir()"类似功能?

c++ - 无法在 C 程序中链接 .a 库文件

macros - 从 textmate bundle 宏中排除文件类型

c - 在 #define 中使用 openmp pragma