微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C - 宏检测到错误的数据类型

如何解决C - 宏检测到错误的数据类型

我正在尝试定义一个可以正确打印任何数据类型的宏,但它似乎可以检测我错误传递的类型。为什么?

代码:(我省略了包含但它们在那里。)

void print_int(int x) { printf("PRINTING INT: %d",x); }
void print_float(float x) { printf("%.3f",x); }
void print_char(char x) { printf("%c",x); }
void print_string(char *x) { printf("%s",x); }
void print_bool(bool x) { printf("%s",x ? "true" : "false"); }

#define print(X) \
    _Generic((X),\
        int: print_int,\
        float: print_float,\
        double: print_float,\
        char: print_char,\
        char *: print_string,\
        bool: print_bool)(X)

int main(void) {
    
    printf("\n\nprint string: ");
    print("Hello there!"); // prints as string

    printf("\nprint int: ");
    print(3); // prints as int

    printf("\nprint float: ");
    print(4.55); // prints as float

    printf("\nprint bool: ");
    print(false); // prints as bool

    printf("\nprint char: ");
    print('A'); // prints as char

    return 0;
}

实际输出

print string: Hello there!
print int: PRINTING INT: 3
print float: 4.550
print bool: PRINTING INT: 0
print char: PRINTING INT: 65

正确的输出

print string: Hello there!
print int: PRINTING INT: 3
print float: 4.550
print bool: false
print char: A

我很想知道哪里出了问题,因为我不知道。

解决方法

在这次通话中

print('A');

参数是一个整数字符常量。

C 中的整数字符常量(与 C++ 中的字符常量相反)具有类型 int 而不是类型 char

来自 C 标准(6.4.4.4 字符常量)

10 整数字符常量的类型为 int

这是一个演示程序,展示了 C 的这种特性。

#include <stdio.h>

int main(void) 
{
    printf( "suzeof( 'A' ) = %zu\n",sizeof( 'A' ) );
    
    char c = 'A';
    
    printf( "suzeof( c ) = %zu\n",sizeof( c ) );

    return 0;
}

程序输出为

suzeof( 'A' ) = 4
suzeof( c ) = 1

如果你想得到预期的结果,那么写

print( (char )'A' );

char c = 'A';
print( c );

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。