精华内容
下载资源
问答
  • 函数原型 ...对于形参列表只需要 说明需要几个参数,分别为什么类型即可,因此以下方式描述可以。 int power(int , int ) 函数声明 int power(int base, int n) 依次是 函数返回类型、...

    c语言一般是从上向下依次执行,原则上函数定义需要出现在函数调用之前,否则会报错。但在实际开发中经常在定义之前就使用他们,这时需要提前声明。

    #include <stdio.h>
    /*函数定义在main之后,需要在main函数之前声明*/
    int readmax(int, int) ;
    
    void main()
    {
        int a, b, c;
        b = 10;
        c = 20;
        a = readmax(b, c);
        printf("%d\n", a);
        getchar();
    }
    
    int readmax(int m, int n)
    {
        if(m > n)
           return m;  
        else
           return n;
    }
    

    函数声明
    函数声明就是给编译器“打个预防针”,告诉它我要使用这个函数,你现在没有找到它的定义不要紧,请不要报错,稍后我会把定义补上。

    int power(int , int ) 
    

    依次是 函数返回类型、函数名和形参列表
    函数声明给出了函数名、返回值类型、参数列表等与该函数有关的信息,称为函数原型
    函数原型不需要函数体,也不需要形式参数的名字,用分号作为原型的结束符。
    对于形参列表只需要 说明需要几个参数,分别为什么类型即可。

    函数定义

    int readmax(int m, int n)
    

    必须要有函数体,同时要有函数的名字,形参的名字和类型
    在函数定义在main之后情况下,函数定义的参数个数和类型以及函数的返回值需要和函数原型一致,否则编译器就会报错。

    在函数定义在main之前情况时,可以省略函数声明。

    #include <stdio.h>
    /*函数定义在main之前,可省略声明*/
    int readmax(int m, int n)
    {
        if(m > n)
           return m;  
        else
           return n;
    }
    
    void main()
    {
        int a, b, c;
        b = 10;
        c = 20;
        a = readmax(b, c);
        printf("%d\n", a);
        getchar();
    }
    
    展开全文
  • 文章目录1 函数dup1.1 dup函数原型1.2 参数说明1.3 返回值1.4 示例2 函数fcntl2.1 fcntl函数原型2.2 参数说明2.3 返回值2.4 示例3 可以用fcntl函数实现dup函数 1 函数dup 函数dup和dup2都是用来复制一个现有的文件...

    1 函数dup

    函数dup和dup2都是用来复制一个现有的文件描述符,并和复制的对象共享已打开的文件。
    在这里插入图片描述

    1.1 dup函数原型

    #include<unistd.h>
    int dup(int fd);
    int dup2(int fd,int fd2);
    

    1.2 参数说明

    fd:文件描述符
    fd2:指定新描述符的值

    1.3 返回值

    若成功,返回新的文件描述符;若出错,返回-1。
    由dup返回的新文件描述符一定是当前可用文件描述符中的最小数值。如上图中,fd(1)指向一个文件,利用fd复制fd为1的文件描述符,此时返回当前可用文件描述符最小数值3,这两个fd共享同一个文件。
    对于dup2,可以用fd2参数指定新描述符的值。如果fd2已经打开,则先将其关闭。如若fd等于fd2,则dup2返回fd2,而不关闭它。

    1.4 示例

    下面程序打开一个文件1.txt,其文件描述符为fd,利用dup函数复制fd至fd2,此时从标准输入读取数据并写入至fd2指向的文件,也即fd所指向的文件"1.txt"。

    #include<stdio.h>
    #include<unistd.h>#include<stdio.h>
    #include<unistd.h>
    #include<fcntl.h>
    #include<stdlib.h>
    
    int main(int argc,char* argv[]){
            int fd;
            char buf[6];
            fd=open("../data/1.txt",O_RDWR|O_APPEND); //以追加方式打开
            if(fd<0)
                    printf("open error!");
            int fd_dup=dup(fd);
            read(STDIN_FILENO,buf,5); //从标准输入写5个字节的数据到buf中
            write(fd_dup,buf,5); //将buf中的数据写入1.txt末尾
    
            close(fd);
            close(fd_dup);
    
            exit(0);
    }
    

    2 函数fcntl

    2.1 fcntl函数原型

    #include<fcntl.h>
    int fcntl(int fd,int cmd,... /* int arg* /);
    

    2.2 参数说明

    fd:文件描述符
    第3个参数:一般是一个整数,但是在说明记录锁时,第3个参数则是指向一个结构的指针
    cmd:指定该函数的功能,facntl依赖cmd参数,有以下5种功能:

    复制一个已有的描述符(cmd=F_DUPFD或F_DUPFD_CLOEXEC)
    获取/设置文件描述符标志(cmd=F_GETFD或F_SETFD)
    获取/设置文件状态标志(cmd=F_GETFL或F_SETFL)
    获取/设置异步I/O所有权(cmd=F_GETOWN或F_SETOWN)
    获取/设置记录锁(cmd=F_GETLK、F_SETLK或F_SETLKW)

    我们在这儿说明这11中cmd的前8种,后3种与记录锁有关。

    cmd 功能
    F_DUPFD 复制文件描述符fd。新文件描述符作为函数值返回。它是尚未打开的各描述符中大于或等于第3个参数值(取为整型值)中各值的最小值。
    F_DUPFD_CLOEXEC 复制文件描述符,设置与新描述符关联的FD_CLOEXEC文件描述符标志的值,返回新文件描述符
    F_GETFD 对应于fd的文件描述符标志作为函数值返回。当前指定义了一个文件描述符标志FD_CLOEXEC
    F_SETFD 对应于fd设置文件描述符标志。新标志值按第3个参数设置(取为整型值)
    F_GETFL 对应于fd的文件状态标志作为函数返回,比如O_RDONLY、O_SYNC等。遗憾的是,5个访问方式标志(O_RDONLY、O_WRONLY、O_RDWR、O_EXEC、以及O_SEARCH)并不各占1位。因此首先必须用屏蔽字O_ACCMODE取得访问方式位,然后将结果与这5个值中的每一个相比较
    F_SETFL 将文件状态标志设置为第3个参数的值(取为整型值)。可以更改的几个标志是:O_APPEND、O_NONBLOCK、O_SYNC、O_DSYNC、O_RSYNC、O_FSYNC和O_ASYNC
    F_GETOWN 获取当前接收SIGIO和SIGURG信号的进程ID或进程组ID。
    F_SETOWN 设置接收SIGIO和SIGURG信号的进程ID或进程组ID。正的arg指定一个进程ID,负的arg表示等于绝对值的一个进程组ID。

    2.3 返回值

    若成功,则依赖于上述的cmd;若出错,返回-1。

    2.4 示例

    下面程序是将当前具有访问权限O_RDWR的文件修改成具有O_RDWR|O_NONBLOCK的权限,要记住,只有在当前进程中有效,如果进程退出,此文件的访问权限依旧是O_RDWR

    #include<stdio.h>
    #include<unistd.h>
    #include<fcntl.h>
    #include<stdlib.h>
    #include<sys/stat.h>
    
    int main(int argc,char* argv[]){
            int fd,val;
            if(fd = open("../data/1.txt",O_RDONLY)<0) //以只读方式打开一个文件
                   printf("open or create file error!");
            if((val=fcntl(fd,F_GETFL,0))<0)
                    printf("fcntl error for fd %d",fd);
            switch (val & O_ACCMODE) //宏O_ACCMODE作为一个掩码与文件状态作AND位运算,产生一个表示文件访问模式的值
            {
                    case O_RDONLY:
                            printf("read only");
                            break;
                    case O_WRONLY:
                            printf("write only");
                            break;
                    case O_RDWR:
                            printf("read write");
                            break;
                    default:
                            printf("unknown access mode");
                            break;
            }
            if(val & O_APPEND)
                    printf(",append");
            if(val & O_NONBLOCK)
                    printf(",nonbloking");
            if(val & O_SYNC)
                    printf(",synchronous writes");
    #if !defined(_POSIX_C_SOURCE) && defined(O_FSYNC) && (O_FSYNC != O_SYNC)
            if(val & O_FSYNC)
                    printf(",synchronous writes");
    #endif
            putchar('\n');
            
    //下面修改文件权限为O_RDWR|O_NONBLOCK
            int flags=O_NONBLOCK;
            val|=flags;
            if(fcntl(fd,F_SETFL,val)<0) //更改文件访问权限为O_RDONLY|O_NONBLOCK
                    printf("fcntl error for fd %d",fd);
            if((val=fcntl(fd,F_GETFL,0))<0)
                    printf("fcntl error for fd %d",fd);
    
            switch (val & O_ACCMODE) //宏O_ACCMODE作为一个掩码与文件状态作AND位运算,产生一个表示文件访问模式的值
            {
                    case O_RDONLY:
                            printf("read only");
                            break;
                    case O_WRONLY:
                            printf("write only");
                            break;
                    case O_RDWR:
                            printf("read write");
                            break;
                    default:
                            printf("unknown access mode");
                            break;
            }
    
            if(val & O_APPEND)
                    printf(",append");
            if(val & O_SYNC)
                    printf(",synchronous writes");
            if(val & O_NONBLOCK)
                    printf(",nonblocking");
            putchar('\n');
            close(fd);
            exit(0);
    }
    

    在终端运行结果:
    在这里插入图片描述

    3 可以用fcntl函数实现dup函数

    实际上,调用

    	dup(fd);
    

    等效于

    	fcntl(fd,F_DUPFD,0);
    

    而调用

    	dup2(fd,fd2);
    

    等效于

    	close(fd2);
    	fcntl(fd,F_DUPFD,fd2);
    

    在后一种情况下,dup2并不完全等同于close加上fcntl。它们之间的区别:

    1. dup2是一个原子操作,而close和fcntl包括两个函数调用。
    2. dup2和fcntl有一些不同的errno。
    展开全文
  • php高级开发教程说明

    2008-11-27 11:39:22
    点,这些方案一般分为两类:简短的变量和函数名及谈话式的变量和函数名(描述变量类型和 目的的更长的名字)。 某个电话目录可能是这个样子的,如表1 - 1所示。 第1章认开发思想部分3 下载 表1-1 电话目录 姓名地址...
  • 1.2.4 函数原型 5 1.2.5 main程序 6 1.2.6 函数定义 7 1.3 变量、值和类型 7 1.3.1 变量 7 1.3.2 命名规则 8 1.3.3 局部变量和全局变量 9 1.3.4 数据类型的概念 9 1.3.5 整数类型 9 1.3.6 浮点类型 10 ...
  • /*以下是函数原型*/ STUDENT *init(); /*初始化函数*/ STUDENT *create(); /*创建链表*/ STUDENT *delete(STUDENT *h); /*删除记录*/ void print(STUDENT *h); /* 显示所有记录*/ void lookup(STUDENT *h); /*...
  • 1C++对C语言作了很多改进下列描述中 使得C语言发生了质变从面向过程变成了面向对象 A增加了一些新的运算符 B允许函数重载并允许设置缺省参数 C规定函数说明必须用原型 D引进了类和对象的概念 2下列描述中 是错误的 A...
  • 设计 1设计思想程序结构如类图重要的数据结构主要算法思想文字描述不要画框图 2设计表示类名及其作用类中数据成员名称及作用类中成员函数原型及其功能可以用表格形式表达 3实现注释各项要求的实现程度在完成基本...
  • C++自创试题

    2020-07-03 18:57:28
    C、规定函数说明必须用原型; D、引进了类和对象的概念; 2¡¢下列描述中,( )是错误的。 A、内联函数主要解决程序的运行效率问题; B、内联函数的定义必须出现在内联函数第一次被调用之前;C、内联函数可以...

    一、选择题1¡¢C++对C语言作了很多改进,下列描述中( )使得C语言发生了质变,从面向过程变成了面向对象。A、增加了一些新的运算符;
    B、允许函数重载,并允许设置缺省参数;
    C、规定函数说明必须用原型;
    D、引进了类和对象的概念;
    2¡¢下列描述中,( )是错误的。
    A、内联函数主要解决程序的运行效率问题;
    B、内联函数的定义必须出现在内联函数第一次被调用之前;C、内联函数中可以包括各种语句;
    D、对内联函数不可以进行异常接口声明;
    3¡¢在C++中,关于下列设置缺省参数值的描述中,( )是正确的。
    A、不允许设置缺省参数值;
    B、在指定了缺省值的参数右边,不能出现没有指定缺省值的参数;
    C、只能在函数的定义性声明中指定参数的缺省值;
    D、设置缺省参数值时,必须全部都设置;
    4¡¢( )不是构造函数的特征。  
    A、构造函数的函数名与类名相同;  
    B、构造函数可以重载;  
    C、构造函数可以设置缺省参数;  
    D、构造函数必须指定类型说明。
    5、( )是析构函数的特征。  
    A、析构函数可以有一个或多个参数;  
    B、析构函数名与类名不同;  
    C、析构函数的定义只能在类体内;  
    D、一个类中只能定义一个析构函数;
    6、关于成员函数特征的下列描述中,( )是错误的。  A、成员函数一定是内联函数;  
    B、成员函数可以重载;  
    C、成员函数可以设置缺省参数值;  
    D、成员函数可以是静态的;
    7、下列静态数据成员的特性中,( )是错误的。  
    A、说明静态数据成员时前边要加修饰符static;  
    B、静态数据成员要在类体外进行初始化;  
    C、静态数据成员不是所有对象所共用的;  
    D、引用静态数据成员时,要在其名称前加<类名>和作用域运算符;
    8、友元的作用是( )。  
    A、提高程序的运用效率;  
    B、加强类的封装性;  
    C、实现数据的隐藏性;  
    D、增加成员函数的种类;
    9、关于new运算符的下列描述中,( )是错误的。
     A、它可以用来动态创建对象和对象数组;  
     B、使用它创建的对象或对象数组可以使用运算符delete删除;  
     C、使用它创建对象时要调用构造函数;  
     D、使用它创建对象数组时必须指定初始值;
     10、关于delete运算符的下列描述中,( )是错误的。  A、它必须用于new返回的指针;  
     B、使用它删除对象时要调用析构函数;  
     C、对一个指针可以使用多次该运算符;
     D、指针名前只有一对方括号符号,不管所删除数组的维数。
     11、const int *p说明不能修改( )。  
     A、p指针;  
     B、p指针指向的变量;  
     C、p指针指向的数据类型;
     D、上述A、B、C三者;
     12、已知:print()函数是一个类的常成员函数,它无返回值,下列表示中,( )是正确的;  
     A、void print() const;  
     B、const void print();  
     C、void const print();
     D、void print(const);
     13、派生类的对象对它的基类成员中( )是可以访问的。  
     A、公有继承的公有成员;
     B、公有继承的私有成员;  
     C、公有继承的保护成员;
     D、私有继承的公有成员;
     14、设置虚基类的目的是( )。  
     A、简化程序;  
     B、消除二义性;  
     C、提高运行效率;
     D、减少目标代码;
     15、下列描述中,正确的是( ) 
     A、虚函数是一个static 类型的成员函数;  
     B、虚函数是一个非成员函数;  
     C、抽象类是指具有纯虚函数的类;
     D、抽象类可以说明其对象;
      二、判断下列描述的正确性,正确填T,错误填F。1¡¢C++中标识符内的大小写字母是没有区别的。( )2¡¢C++是一种以编译方式实现的高级语言。( )
    3¡¢计算函数参数顺序引起的二义性是由不同的编译系统决定的。( )
    4¡¢返回值类型、参数个数和类型都相同的函数也可以重载。( )
    5¡¢使用关键字class定义的类中缺省的访问权限是私有(private)的。( )
    6¡¢类的私有成员只能被类中的成员函数访问,任何类以外的函数对它们的访问都是非法的。( )
    7¡¢多继承情况下,派生类的构造函数的执行顺序取决于成员初始化列表中的顺序。( )
    8¡¢在公有继承中,基类中的公有成员和私有成员在派生类中都是可见的。( )
    9¡¢在私有继承中,基类中所有成员对派生类都是不可见的。( )
    10¡¢在保护继承中,对于垂直访问等同于公有继承,对于水平访问等同于私有继承。( )
    11¡¢构造函数可以声明为虚函数。( )
    12¡¢在析构函数中调用虚函数时,采用动态束定。( )13¡¢在一个成员函数内调用一个虚函数时,对该虚函数的调用进行动态束定。( )
    14¡¢公有继承可以实现子类型。( )
    15¡¢构造函数可以声明为纯虚函数。( )

    展开全文
  • c实现毫秒、微秒级定时器

    千次阅读 2018-04-20 00:34:22
    秒级定时器,都知道可以用sleep实现,但如果要实现毫秒级呢?usleep? 使用select实现 select函数原型:int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); ...

    秒级定时器,都知道可以用sleep实现,但如果要实现毫秒级呢?usleep?

    使用select实现

    select函数原型:int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

    参数说明:
    slect的第一个参数nfds为fdset集合中最大描述符值加1,fdset是一个位数组,其大小限制为__FD_SETSIZE(1024),位数组的每一位代表其对应的描述符是否需要被检查。
    select的第二三四个参数表示需要关注读、写、错误事件的文件描述符位数组,这些参数既是输入参数也是输出参数,可能会被内核修改用于标示哪些描述符上发生了关注的事件。所以每次调用select前都需重新初始化fdset。
    timeout参数为超时时间,该结构会被内核修改,其值为超时剩余的时间。

    如果我们指定了参数timeval的值,而将其他参数都置为0或者NULL,那么在时间耗尽后,select函数便返回,基于这一点,我们可以利用select实现精确定时。

    一、秒级定时器

    void seconds_sleep(unsigned seconds){
        struct timeval tv;
        tv.tv_sec=seconds;
        tv.tv_usec=0;
        int err;
        do{
           err=select(0,NULL,NULL,NULL,&tv);
        }while(err<0 && errno==EINTR);
    }

    二、毫秒级别定时器

    void milliseconds_sleep(unsigned long mSec){
        struct timeval tv;
        tv.tv_sec=mSec/1000;
        tv.tv_usec=(mSec%1000)*1000;
        int err;
        do{
           err=select(0,NULL,NULL,NULL,&tv);
        }while(err<0 && errno==EINTR);
    }

    三、微妙级别定时器

    void microseconds_sleep(unsigned long uSec){
        struct timeval tv;
        tv.tv_sec=uSec/1000000;
        tv.tv_usec=uSec%1000000;
        int err;
        do{
            err=select(0,NULL,NULL,NULL,&tv);
        }while(err<0 && errno==EINTR);
    }

    关于精确度,可以看参考2、3

    参考
    linux使用select实现精确定时器详解
    关于usleep定时和使用select 准确率说明
    再论精确延时(usleep,nanosleep,select)

    展开全文
  • C、规定函数说明必须用原型;D、引进了类和对象的概念;2、下列描述中,( )是错误的。内联函数:系统默认的在类定义提内实现。也就是 类内实现的成员函数。2|、类外用inline定义;和宏替换的区别:系统可以识别,...
  • OpenGL编程参考手册

    2009-08-21 09:50:45
    一旦了解了这些命令的功能,你就可以利用这些完整的函数原型作为快速参考。 第4章 定义的常量及相关命令 列举了在OpenGL中定义的常量和使用这些常量的命令。 第5章 OpenGL参考说明 本书的主体部分,它包括各组...
  • OpenGL 参考手册

    2008-10-31 14:03:41
    一旦了解了这些命令的功能,你就可以利用这些完整的函数原型作为快速参考。 第4章 定义的常量及相关命令 列举了在OpenGL中定义的常量和使用这些常量的命令。 第5章 OpenGL参考说明 本书的主体部分,它包括...
  •  由C系统提供,用户无须定义, 也不必在程序中作类型说明,只需在程序前包含有该函数原型的头文件即可在程序中直接调用。在前面各章的例题中反复用到printf 、 scanf 、 getchar 、putchar、gets、puts、strcat等...
  • 校园导航系统(实现简单查询)

    热门讨论 2011-05-24 15:27:30
    下面分别描述这些函数,建立它们函数原型。 1、主函数 函数原型:void main(void) 功 能:控制程序。 参 数:void 返 回 值:void 要 求:管理菜单命令并完成初始化。 2、菜单选择和处理函数 函数原型:int ...
  • TCP/IP进行网际互联第二卷:设计、实现与内核(第三版) 基本信息 原书名:Internetworking With TCP/IP Vol Ⅱ:Design,Implementation,and Internals Third Edition 作者: (美)Douglas E.Comer David L....
  • 1.6.1 函数原型 1.6.2类属指针 1.6.3原始系统数据类型 1.7 出错处理 1.8 用户标识 1.8.1 用户ID 1.8.2 组ID 1.8.3 添加组ID 1.9 信号 1.10 UNIX时间值 1.11 系统调用和库函数 1.12 小结 习题 第2章 UNIX标准化及...
  • PAT 1011 World Cup Betting

    2021-01-12 19:33:32
    (1)printf的%f说明符既可以输出float型又可以输出double型。 根据“默认参数提升”规则(在printf这样的函数的可变参数列表中,不论作用域内有没有原型,都适用这一规则)float型会被提升为double型。因此printf()...
  • C++复习资料之系列

    2008-12-30 21:35:45
    3.有函数原型 void fun2( int * ); 下面选项中,正确的调用是( c )。 (a) double x = 2.17 ; fun2( &x ); (b) int a = 15 ; fun2( a*3.14 ); (c) int b = 100 ; fun2( &b ); (d) fun2( 256 ); 4.有函数原型 ...
  • 你必须知道的495个C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    1.27 我的编译器总在报函数原型不匹配的错误,可我觉得没什么问题。这是为什么? 1.28 文件中的第一个声明就报出奇怪的语法错误,可我看没什么问题。这是为什么? 1.29 为什么我的编译器不允许我定义大数组,如...
  • 面向对象与C++试题.doc

    2013-12-16 20:49:17
    3、考虑下面的函数原型声明: void DefPar(int a, int b=7, char z = '*'); 下面函数调用中,不合法的是( )。 A.DefPar(5); B.DefPar(5,8); C.DefPar(5,'#'); D.DefPar(0,0,'*'); 4、系统在调用重载函数时往往...
  • 详细描述一下原型链(是什么?有什么?有哪些特点?) 防抖和节流,以及它们的应用场景? 详细说说 var、let、const 的区别? this 到底指向谁?请分情况说明。 什么是闭包?以及它的使用场景? 如何初始化一个二...
  • 通用格式,了解函数原型是如何提高程序可靠性的。同时,还将学习如何编写函数来处理数组、字符串和 结构。还要学习有关递归的知识(即函数在什么情况下调自身)以及如何它来实现分而治之的策略。最 后将介绍函数...
  • 通用格式,了解函数原型是如何提高程序可靠性的。同时,还将学习如何编写函数来处理数组、字符串和 结构。还要学习有关递归的知识(即函数在什么情况下调自身)以及如何它来实现分而治之的策略。最 后将介绍函数...
  • openGL 参考手册

    2011-05-08 23:31:36
    一旦了解了这些命令的功能,你就可以利用这些完整的函数原型作为快速参考。 第4章 定义的常量及相关命令 列举了在OpenGL中定义的常量和使用这些常量的命令。 第5章 OpenGL参考说明 本书的主体部分,它包括...
  • 通用格式,了解函数原型是如何提高程序可靠性的。同时,还将学习如何编写函数来处理数组、字符串和 结构。还要学习有关递归的知识(即函数在什么情况下调自身)以及如何它来实现分而治之的策略。最 后将介绍函数...
  • 通用格式,了解函数原型是如何提高程序可靠性的。同时,还将学习如何编写函数来处理数组、字符串和 结构。还要学习有关递归的知识(即函数在什么情况下调自身)以及如何它来实现分而治之的策略。最 后将介绍函数...
  • 确定有哪些函数组成该程序,并且说明每个函数原型、功能或目的;每个函数要借助于哪些函数共同完成了什么功能; ③编码与验证 程序的主界面;各个函数的伪代码或流程图;程序的使用说明;程序功能上的验证性测试;...
  • 《你必须知道的495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    1.27 我的编译器总在报函数原型不匹配的错误,可我觉得没什么问题。这是为什么? 15 1.28 文件中的第一个声明就报出奇怪的语法错误,可我看没什么问题。这是为什么? 15 1.29 为什么我的编译器不允许我定义大数...

空空如也

空空如也

1 2 3 4 5
收藏数 93
精华内容 37
关键字:

可以用函数原型说明描述