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 );
我正在尝试定义一个可以正确打印任何数据类型的宏,但它似乎无法检测到我传递的类型不正确。为什么?
代码:(我没有包括在内,但它们在那里。)
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 );