📜  _C中的通用关键字

📅  最后修改于: 2021-05-25 23:14:39             🧑  作者: Mango

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基础课程》。