首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >打印组合_Generic和variadic_functions

打印组合_Generic和variadic_functions
EN

Stack Overflow用户
提问于 2021-05-21 09:56:45
回答 1查看 76关注 0票数 1

我读过_Generic combined with variadic function?

http://www.robertgamble.net/2012/01/c11-generic-selections.html

但是我想让print像python一样接收多个未知类型的参数。

代码语言:javascript
复制
print("a", 1) //printf("%s %d", "a", 1)

这是我的代码

代码语言:javascript
复制
//compiler gcc
#define COUNT(...) ({register int i;int c=1;for(i=0;i<=(strlen(#__VA_ARGS__));i++){if (#__VA_ARGS__[i]==','){c++;}};c;})


#define _print(object) printf( _Generic((object),  \
        _Bool: "bool%d",                  unsigned char: "%hhu",          \
         char: "%c",                     signed char: "%hhd",            \
    short int: "%d",         unsigned short int:"%d",     \
          int: "%d",                     unsigned int: "%u",           \
     long int: "%lu",           unsigned long int: "%lu",      \
long long int: "%llu", unsigned long long int: "%llu", \
        float: "%f",                         double: "%f",                 \
  long double: "%Lf",                   char *: "%s",        \
       void *: "%p",                int *: "%p",         \
      default: "<unknow object at %p>") , object)
void pyprint(int LEN, ...){
    va_list ap;
    va_start(ap, LEN);int i;
    for (int i = 0; i < LEN; i++)
    {
        _print(va_arg(ap, int));
    } }
#define print(...) pyprint(COUNT(__VA_ARGS__), __VA_ARGS__)
//print('A', 10, -10);  ->6510-10
//but print only receive int object because va_arg(ap, int)
EN

回答 1

Stack Overflow用户

发布于 2021-05-21 14:59:33

坏消息是,如果其中一个参数中包含逗号,则COUNT宏将无法工作。典型的例子是fun(1,2)"Hello, Bob!"

我建议使用宏来计算参数,但是它限制了支持的最大参数数量。

该宏的工作方式是在展开的VA_ARGS列表之后添加一个连续整数列表。因此,特定位置上的参数将包含许多传递给宏的参数。

代码语言:javascript
复制
#define print(...) print_(__VA_ARGS__, 8, 7, 6, 5, 4, 3, 2, 1, 0);
#define print_(a0, a1, a2, a3, a4, a5, a6, a7, CNT, ...) \
do {                              \
    if (CNT > 0) _print(a0); \
    if (CNT > 1) _print(a1); \
    if (CNT > 2) _print(a2); \
    if (CNT > 3) _print(a3); \
    if (CNT > 4) _print(a4); \
    if (CNT > 5) _print(a5); \
    if (CNT > 6) _print(a6); \
    if (CNT > 7) _print(a7); \
    puts("");                \
} while (0)

该解决方案最多可以处理8个参数,但这个限制可以很容易地解除。用法:

代码语言:javascript
复制
int main() {
    print("a");
    print(3, " / ", 2, " = ", 1.5);
    print('A', 10, -10);
    char a = 'A';
    print(a, 10, -10);
}

打印

代码语言:javascript
复制
a
3 / 2 = 1.500000
6510-10
A10-10

'A'打印为整数的问题不容易解决,因为C标准要求字符文字是整型的。参见`character constant

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67629921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档