使用 ## 预处理器运算符的示例
Example of using the ## preprocessor operator
我知道以下是一个非常简单的示例,但我如何将以下内容转换为使用预处理器 ##
'glue' 运算符的单个函数调用?
void print_string(char *s)
{
printf("%s\n", s);
}
void print_num(int n)
{
printf("%d\n", n);
}
int main(void)
{
print_string("Hello");
print_num(5);
}
我唯一能做的(这并没有真正简化任何事情)是:
#define PRINT(type) print_ ## type
PRINT(string)("Hello");
PRINT(num)(4);
或者,有更好的使用方法吗?
您可以将标识作为第一个函数参数:
#define PRINT(type, value) print_ ## type(value)
PRINT(string, "Hello");
PRINT(num, 4);
但我认为写 printf
没有任何价值,因为在 int
的情况下,有人将不得不学习写 num
,他还不如学习使用%d
无论如何:
printf("%s\n", "Hello");
printf("%d\n", 4);
在 pre 处理器中无法进行类型分派 - 它不知道类型。在 C11 中有 _Generic
允许编译器根据类型选择不同的函数:
#define PRINT(value) _Generic((value), \
char *: print_string, \
int: print_int)(value)
PRINT("Hello");
PRINT(4);
通过在每个参数上重载宏并在每个参数上应用这样的 _Generic
宏,可以构建 C++ std::cout
的替代品。所以有点自我推销:这是我在 yio library 中探索的一个主题,它允许只做:
yprint("Hello ", 4, "\n");
我知道以下是一个非常简单的示例,但我如何将以下内容转换为使用预处理器 ##
'glue' 运算符的单个函数调用?
void print_string(char *s)
{
printf("%s\n", s);
}
void print_num(int n)
{
printf("%d\n", n);
}
int main(void)
{
print_string("Hello");
print_num(5);
}
我唯一能做的(这并没有真正简化任何事情)是:
#define PRINT(type) print_ ## type
PRINT(string)("Hello");
PRINT(num)(4);
或者,有更好的使用方法吗?
您可以将标识作为第一个函数参数:
#define PRINT(type, value) print_ ## type(value)
PRINT(string, "Hello");
PRINT(num, 4);
但我认为写 printf
没有任何价值,因为在 int
的情况下,有人将不得不学习写 num
,他还不如学习使用%d
无论如何:
printf("%s\n", "Hello");
printf("%d\n", 4);
在 pre 处理器中无法进行类型分派 - 它不知道类型。在 C11 中有 _Generic
允许编译器根据类型选择不同的函数:
#define PRINT(value) _Generic((value), \
char *: print_string, \
int: print_int)(value)
PRINT("Hello");
PRINT(4);
通过在每个参数上重载宏并在每个参数上应用这样的 _Generic
宏,可以构建 C++ std::cout
的替代品。所以有点自我推销:这是我在 yio library 中探索的一个主题,它允许只做:
yprint("Hello ", 4, "\n");