c - 使用带有 MACROS 的 Switch
问题描述
我正在尝试使用头文件 (.h) 中的宏来模拟 Switch 语句。
我有一些预定义的宏:
#define MULTIPLY_BY_1 1
#define MULTIPLY_BY_10 2
#define MULTIPLY_BY_100 3
#define MULTIPLY_BY_1000 4
#define CHOSEN_FACTOR MULTIPLY_BY_100
我有一个const result
根据CHOSEN_FACTOR
(用户将定义这个宏)取值的值。我在头文件中,我想像这样“模拟” switch 语句:
switch(CHOSEN_VALUE)
{
case MULTIPLY_BY_1:
const uint16_t result = 5;
break;
case MULTIPLY_BY_10:
const uint16_t result = 50;
break;
case MULTIPLY_BY_100:
const uint16_t result = 500;
break;
case MULTIPLY_BY_1000:
const uint16_t result = 50000;
break;
default:
break;
}
编辑:
在源文件(.c)中,我想使用这样的结果:
uint16_t foo(void)
{
uint16_t myFoo = getMyFooValue();
return result * myFoo;
}
是否有任何基于宏的解决方案?是否有更优化的方法来获得相同的结果?
解决方案
假设我了解您的要求,我认为您正在寻找这样的东西:
#define INIT_FACTOR(var, value) \
#ifdef CHOSEN_FACTOR \
#if CHOSEN_FACTOR == MULTIPLY_BY_1 \
const uint16_t var = value \
#elif CHOSEN_FACTOR == MULTIPLY_BY_10 \
const uint16_t var = value * 10 \
#elif CHOSEN_FACTOR == MULTIPLY_BY_100 \
const uint16_t var = value * 100 \
#elif CHOSEN_FACTOR == MULTIPLY_BY_1000 \
const uint16_t var = value * 1000 \
#endif \
#else \
const uint16_t var = value \
#endif
这将定义一个名为的宏INIT_FACTOR
,它接受两个参数,即要定义的变量的名称和起始值。您可以将其添加到代码正文中
INIT_FACTOR(result, 5);
然后,如果CHOSEN_FACTOR
是MULTIPLY_BY_100
,那条线将扩展到
const uint16_t result = 5 * 100;
如果CHOSEN_FACTOR
未定义,则该行扩展为
const uint16_t result = 5;
请记住,宏替换发生在编译时,而不是运行时。如果您想要一个运行时解决方案,这不是。
推荐阅读
- javascript - 在 Netlify 中集成 Stripe Checkout
- php - 浏览关闭后如何保存PHP会话?(没有单独的 cookie)
- android - 在安装 Android Studio 时,我收到带有文本的对话框 obection,因为 org.jetbrains.android 插件缺少 Windows 10
- php - 注意:尝试在第 97 行名称的 C:\xampp\htdocs\res\index.php 中访问 null 类型值的数组偏移量:
- mysql - 选择不能为空的列名
- express - Axios 无需在 gzip 中解压缩即可获取响应正文
- unity3d - 统一输入事件?
- c# - 发送复选框值以访问数据库
- react-native - react-native-image-picker: NativeModule.ImagePickerManager 为空
- r - 在数据帧上使用聚合函数时无法将类“函数”强制为数据帧