(C) 如何提取外部文件中宏的定义?

问题描述 投票:0回答:1

我目前正在创建一组随机函数,我将在未来的 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。

c macros
1个回答
0
投票
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 智能感知有关,只需更改基本名称即可。

© www.soinside.com 2019 - 2024. All rights reserved.