我有这个函数采用 int* 作为参数并将其第 n 位更改为 1 或 0 :
void change_nth_bit(int *value, uint8_t bit, uint8_t n) {
(*value) ^= (-bit ^ (*value)) & (1U << n);
}
我可以保证它会工作,因为值可以是类型:
- *uint8_t
- *字符
- *uint16_t
或者我应该为每种数据类型创建一个函数?
最佳答案
您不能使用单个函数来实现此目的,您需要多个函数。
否则,访问(*value)
,它是指向uint8_t
对象的整数指针,即
// This code is broken
unit8_t val = 0xC4;
change_nth_bit((int*)&val, 3, 1);
// ^^^^^^
// |
// Invalid ------+
会导致未定义的行为。
请注意,如果将此代码放入宏中(在用宏参数引用替换指针后),您应该能够实现所需的结果,而无需重复代码:
#define CHANGE_NTH_BIT(v,b,n) (v) ^= (-(b) ^ (v)) & (1U << (n))
关于C 多个数据类型传递给同一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46990753/