CC++中的void类型探究

    技术2022-05-19  28

    1:概述

    C/C++void类型本意指的是,无类型。就说这个类型,不像intdouble那样成为一个可以提供用户正常使用的系统数据类型。如果定义了一个变量如下:

    void v;

    Linux中,用gcc编译报错如下:“variable or field  'v' declared void”。

    如果定义void类型的指针,如下:

    void * p;

    Linux中,用gcc编译,没有问题。

    也就是说,void不能用于一般的系统数据类型,但是可以用作指针。其实void的真正用途用在指针上,他可以指向任意类型的指针。

    2void的用途

    void主要用在,函数返回类型函数参数传递类型转换上

    2.1 函数返回值

    如果一个函数没有返回值,则应该声明为void类型,比如:

    void f(int p);

    有些编译器,在用户没有声明函数的返回值时,系统会自动判断为int类型,但是为了程序的可移植性和安全性,最好显式声明函数的类型。

    2.2 函数参数

    如果一个函数没有返回值,则应声名为void:比如

    int f(void);

    通常,我们可以省略为:int f(),这是不好的,有潜在的危险。

    程序如下:

     

    #include<stdio.h> void f1(); void f2(void); int main(int argc,char *argv[]) { int p =10; f1(p);//@1 f2(p);//@2 return 0; } void f1() { printf("f1 I am not receive a parameter./n"); } void f2(void) { printf("f2 I am not receive a parameter./n"); }

    编译器及平台为:gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5)

    在注释掉@2,只有@1时,运行如下:

    f1 I am not receive a parameter.

    f1是个没有参数的函数,调用时,传递了参数,程序可以正常运行,这是错误的。

    在加上@2时,运行如下:

    error: too many arguments to function 

    这说明,如果没有显示声明参数为void,则会发生意想不到的错误。

    2.3 任意类型的参数传递

    如果一个函数的参数类型不确定,则可以用void来实现。比如,内存操作的函数原型:

    void * memcpy(void *dest, const void *src, size_t len);void * memset ( void * buffer, int c, size_t num ); 

    前边提到过,void可以用作void指针,可以指向任意类型的数据类型。比如:

    int i1 = 10;

    int * p = &i1;

    void * pv = (int *)p

    则,pv就指向了i1

    下面为一个程序演示:

     

    #include<stdio.h> void type_less(const void * p,const int cmd); struct person { int id; char * name; }; int main(int argc, char * argv[]) { int i=10; double d = 100.001; struct person p_person ={1,"sa"}; void *sa; double * pd = &d; int *p = &i; char * str="liyachao"; struct person * pp = &p_person; type_less(p,1); type_less(pd,2); type_less(str,3); type_less(pp,4); return 0; } void type_less(const void * p,const int cmd) { int * p_int; char * p_char; double * p_double; struct person * pp; switch(cmd) { case 1: p_int = (int *)p;//转换为int类型 printf("paramenter int is %d./n",*p_int); break; case 2: p_double = (double *)p;//转换为double类型 printf("paramenter double is %lf./n",* p_double); break; case 3: p_char = (char *)p;//转换为char *类型 printf("paramenter char is %s./n",p_char); break; case 4: pp = p;//转换为结构体类型 printf("person id is %d,name is %s./n",pp->id,pp->name); break; default: break; } }

    gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5)下运行如下:

    paramenter int is 10.

    paramenter double is 100.001000.

    paramenter char is liyachao.

    person id is 1,name is sa.

     

    总结:

    void包含着丰富的程序设计哲学,作为一个设计人员,应该对这些,细微的差别进行思考。


    最新回复(0)