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

C - Macro detects wrong datatypes

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

代码:(我没有包括在内,但它们在那里。)

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 An integer character constant has type 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 );