我目前正在创建一组随机函数,我将在未来的 C 项目中将其用作库(我只需要头文件并链接库)。
一切都工作得很好,但我发现我的
.h
文件非常不可读,并且由于具有相同基本名称的函数数量,它在 VSCode 智能感知中造成了混乱。
例如,这是我在头文件中实现的 isPrime()
函数:
/** @brief Type-generic primality checker using O(sqrt(n)) algorithm */
#define isPrime(n) \
_Generic((n), \
u8 : isPrimeu8, \
u16: isPrimeu16, \
u32: isPrimeu32, \
u64: isPrimeu64, \
i8 : isPrimei8, \
i16: isPrimei16, \
i32: isPrimei32, \
i64: isPrimei64, \
default: isPrimeu64 \
)(n)
bool isPrimeu8(u8 n);
bool isPrimeu16(u16 n);
bool isPrimeu32(u32 n);
bool isPrimeu64(u64 n);
bool isPrimei8(i8 n);
bool isPrimei16(i16 n);
bool isPrimei32(i32 n);
bool isPrimei64(i64 n);
(我使用我自己的类型,只是 typedef : u -> 无符号整数,i -> 有符号整数,f -> 浮点数。然后后面的数字是位大小)
正如你所看到的,代码中有很多冗余,因为我希望我的函数是类型通用的(这在 C 中是一个痛苦)。这是我的目标的一个例子:
/** @brief Type-generic primality checker using O(sqrt(n)) algorithm */
#define isPrime(n) __my_function_with_all_the_type_generic_mess(n)
那么,有没有办法做到这一点?将通用命令提取到另一个文件中,以便我的函数
isPrime()
在导入我的库时仍然有效?
注意:我目前正在使用 C23 的最新功能,所以即使是实验性的东西对我来说也有好处,我有 GCC 13.2,并且在可用时肯定会有 GCC 14。
bool isPrimeu8(u8 n);
bool isPrimeu16(u16 n);
bool isPrimeu32(u32 n);
bool isPrimeu64(u64 n);
bool isPrimei8(i8 n);
bool isPrimei16(i16 n);
bool isPrimei32(i32 n);
bool isPrimei64(i64 n);
如果您单独定义它们,一种简化方法是使用宏生成它们:
#define gen_isprime(type) \
bool isPrime##type(type n) { \
// Add the code here \
} \
// And now:
gen_isprime(u8)
gen_isprime(u16)
gen_isprime(u32)
gen_isprime(u64)
gen_isprime(i8)
gen_isprime(i16)
gen_isprime(i32)
gen_isprime(i64)
虽然我不明白为什么你不能只有两个
isPrimeu64()
和 isPrimei62()
函数,或者不使用 stdint.h
中的类型(`uint64_t、int32_t 等)。
如果您的问题与 VSCode 智能感知有关,只需更改基本名称即可。