C / C++中Macro的主要缺点是对参数进行了强类型检查,即,宏可以在不进行类型检查的情况下对不同类型的变量(例如char,int,double,..)进行操作。
// C program to illustrate macro function.
#include
#define INC(P) ++P
int main()
{
char *p = "Geeks";
int x = 10;
printf("%s ", INC(p));
printf("%d", INC(x));
return 0;
}
输出:
eeks 11
因此,我们避免使用Macro。但是在用C编程实现C11标准之后,我们可以在新关键字“ _Generic”的帮助下使用Macro。我们可以为不同类型的数据类型定义MACRO。例如,以下宏INC(x)根据x的类型转换为INCl(x),INC(x)或INCf(x):
#define INC(x) _Generic((x), long double: INCl, \
default: INC, \
float: INCf)(x)
例子:-
// C program to illustrate macro function.
#include
int main(void)
{
// _Generic keyword acts as a switch that chooses
// operation based on data type of argument.
printf("%d\n", _Generic( 1.0L, float:1, double:2,
long double:3, default:0));
printf("%d\n", _Generic( 1L, float:1, double:2,
long double:3, default:0));
printf("%d\n", _Generic( 1.0L, float:1, double:2,
long double:3));
return 0;
}
输出:
注意:如果您正在运行C11编译器,则将出现以下提到的输出。
3
0
3
// C program to illustrate macro function.
#include
#define geeks(T) _Generic( (T), char: 1, int: 2, long: 3, default: 0)
int main(void)
{
// char returns ASCII value which is int type.
printf("%d\n", geeks('A'));
// Here A is a string.
printf("%d",geeks("A"));
return 0;
}
输出:
2
0
想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。