问题描述
我正在尝试定义一个可以正确打印任何数据类型的宏,但它似乎可以检测我错误传递的类型。为什么?
代码:(我省略了包含但它们在那里。)
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 );