c# 串联预处理器令牌

m4pnthwp  于 2023-03-27  发布在  C#
关注(0)|答案(2)|浏览(195)

如何编写一个宏#define CONCATENATE(x),它将产生以下结果:

CONCATENATE(int); // Produce --> int
CONCATENATE(unsigned int); // Produce --> unsignedint
CONCATENATE(long long int); // Produce --> longlongint
etc.

结果可能与我上面写的不同。唯一的要求是结果是单个标记。我需要它是单个标记,因为此标记将用于定义名称包含此标记的函数,例如void Foo_longlongint(void);

编辑

我想使用一些宏技巧来创建泛型函数。例如,我们想声明一个泛型缓冲区:

#define DECLARE(type, size) struct {type buffer[size];}

现在我想为许多可能的类型创建函数,例如:

#define DEFINE_FUNCTION(type)                                 \
void Buffer_##type##_Add(size_t idx, type *buffer, type data) \
{                                                             \
    buffer[idx] = data;                                       \
}
5jvtdoz2

5jvtdoz21#

为什么不:

#define gen_foo(_type) \
        static inline void foo_##_type (void) { /* Do whatever */ } 

gen_foo(int)
gen_foo(longint)
gen_foo(unsigned)
gen_foo(size_t)
gen_foo(longlongint)
brqmpdu1

brqmpdu12#

明确地说:使用单独的类型名称和类型规范。

#define DEFINE_FUNCTION(type, name)                               \
    void Buffer_##name##_Add(size_t idx, type *buffer, type data) \

对于任何类型的泛型编码,C的工具集都非常有限,特别是如果你使用的是C99。最好避免任何技巧,即使这可能意味着更多的输入。

相关问题