【发布时间】:2023-03-07 12:04:01
【问题描述】:
我有以下宏
#define REG_PWR_CTRL 0x2D
#define REG_FIFO_CTL 0x38
#define VERBOSE(...) \
if(verbose) \
printf(__VA_ARGS__);
#define READ_REGISTER(i2c_dev_file, REGISTER, variable) \
{ \
variable = i2c_smbus_read_byte_data(i2c_dev_file, REGISTER); \
}
#define WRITE_REGISTER_VERBOSE(i2c_dev_file, REGISTER, value) \
{ \
short int var = 0; \
i2c_smbus_write_byte_data(i2c_dev_file, REGISTER, value); \
usleep(100); \
READ_REGISTER(i2c_dev_file, REGISTER, var); \
VERBOSE(#REGISTER " :0x%02X\n", var); \
}
我希望REGISTER 字段不要在以下行中展开VERBOSE(#REGISTER " :0x%02X\n", var); \
例如,当我写WRITE_REGISTER_VERBOSE(i2c_dev_fd, REG_PWR_CTRL, 0x1A);WRITE_REGISTER_VERBOSE(i2c_dev_fd, REG_FIFO_CTL, 0xC6);
我得到了输出0x2D :0x1A0x38 :0xC6
我要获取REG_PWR_CTRL :0x1AREG_FIFO_CTL :0xC6
我遇到了很多关于添加额外间接级别的帖子。
我尝试了这里描述的答案https://stackoverflow.com/a/2653351/1761555 ..虽然我相信这个答案完全是针对不同的问题..
我做的是
#define STRINGIFY(label) (#label)
#define WRITE_REGISTER_VERBOSE(i2c_dev_file, REGISTER, value) \
{ \
short int var = 0; \
i2c_smbus_write_byte_data(i2c_dev_file, REGISTER, value); \
usleep(100); \
READ_REGISTER(i2c_dev_file, REGISTER, var); \
VERBOSE("%s :0x%02X\n", STRINGIFY(REGISTER), var); \
}
但这仍然给我和以前一样的输出
有什么办法可以做到吗?
【问题讨论】:
-
查看C
#definemacro for debug printing 讨论为什么if (verbose)测试不如书面以及如何处理。如果您使用VERBOSE的唯一上下文是宏 WRITE_REGISTER_VERBOSE,那么您会没事的;如果它在其他地方使用,则需要小心,因为它可能会导致程序被重新解释(尽管它很可能只会产生语法错误,但原因可能并不明显!)。