将参数发送给#define
Sending parameter to a #define
我想知道是否可以将参数发送到 #define
宏以选择不同的输出
例如:
#define Row(1) LPC_GPIO0
#define Row(2) LPC_GPIO3
#define Row(3) LPC_GPIO2
然后在我的代码中创建一个循环来发送参数
Row(x)
此宏语法不存在。
此外,它不可能存在,因为宏在编译器编译代码之前展开。如果您的 x
不是编译时常量,则永远无法确定要在宏调用的源代码中替换什么。
如果您需要索引一些值,只需使用数组,例如(假设这些常量是整数):
static int rows[] = { 0, LPC_GPIO0, LPC_GPIO3, LPC_GPIO2 };
写作
rows[x]
您的无效宏语法似乎会产生您所期望的效果。
如果你想使用宏
#define GPIOx(x) GPIO##x
和GPIOx(1)
将扩展为GPIO1
如果你想在运行时计算这些,有一种方法可以做你想做的事
#define Row(x) (x == 1 ? LPC_GPIO0 : (x == 2 ? LPC_GPIO3 : (x == 3 ? LPC_GPIO2 : ERROR_VALUE)))
尽管随着选项数量的增加,这会变得混乱
此外,即使您确实希望在编译时对其求值,只要 x 是常量,大多数优化编译器都会为您执行此操作
我想知道是否可以将参数发送到 #define
宏以选择不同的输出
例如:
#define Row(1) LPC_GPIO0
#define Row(2) LPC_GPIO3
#define Row(3) LPC_GPIO2
然后在我的代码中创建一个循环来发送参数
Row(x)
此宏语法不存在。
此外,它不可能存在,因为宏在编译器编译代码之前展开。如果您的 x
不是编译时常量,则永远无法确定要在宏调用的源代码中替换什么。
如果您需要索引一些值,只需使用数组,例如(假设这些常量是整数):
static int rows[] = { 0, LPC_GPIO0, LPC_GPIO3, LPC_GPIO2 };
写作
rows[x]
您的无效宏语法似乎会产生您所期望的效果。
如果你想使用宏
#define GPIOx(x) GPIO##x
和GPIOx(1)
将扩展为GPIO1
如果你想在运行时计算这些,有一种方法可以做你想做的事
#define Row(x) (x == 1 ? LPC_GPIO0 : (x == 2 ? LPC_GPIO3 : (x == 3 ? LPC_GPIO2 : ERROR_VALUE)))
尽管随着选项数量的增加,这会变得混乱
此外,即使您确实希望在编译时对其求值,只要 x 是常量,大多数优化编译器都会为您执行此操作