精华内容
下载资源
问答
  • C语言函数原型功能及其头文件 C语言函数原型功能及其头文件
  • C语言函数原型的作用

    千次阅读 2019-10-29 21:27:20
    函数原型(Function Prototype):即函数声明给出了函数名、返回值类型、参数列表(重点是参数类型)等与该函数有关的信息。 函数原型的作用:告诉编译器与该函数有关的信息,让编译器知道函数的存在,以及存在的...

    函数原型(Function Prototype):即函数声明给出了函数名、返回值类型、参数列表(重点是参数类型)等与该函数有关的信息。

    函数原型的作用:告诉编译器与该函数有关的信息,让编译器知道函数的存在,以及存在的形式,即使函数暂时没有定义,编译器也知道如何使用它。

    有了函数声明,函数定义就可以出现在任何地方了,甚至是其他文件、静态链接库、动态链接库等。但是如果函数本身带static修饰,那么作用域是当前文件,从声明位置或者定义位置,到文件结尾。如果函数没有static,那么作用域为整个工程或者说是项目。

    单文件例子:

    #include <stdio.h>
    
    //函数声明
    int sum(int m, int n);  //也可以写作int sum(int, int);
    
    int main(){
        ...
        int result = sum(begin, end);
        return 0;
    }
    
    //函数定义
    int sum(int m, int n){
        ...
        return sum;
    }

    有人会说:将函数原型删去,并且直接在原来的位置上使用函数定义,对程序本身的使用是没有任何影响的。

    事实上举个简单例子:当两个函数互相调用的时候,函数原型的作用就凸显出来了:

    void fun1(int a) {
        if (a > 0) {
            fun2(a);
        }else {
            return;
        }
    }
    
    void fun2(int a) {
        if (a < 0) {
            fun1(a);
        }else {
            return;
        }
    }

    对于单个源文件的程序,通常是将函数定义放到 main() 的后面,将函数声明放到 main() 的前面,这样就使得代码结构清晰明了,主次分明。

    使用者往往只关心函数的功能和函数的调用形式,很少关心函数的实现细节,将函数定义放在最后,就是尽量屏蔽不重要的信息,凸显关键的信息。将函数声明放到 main() 的前面,在定义函数时也不用关注它们的调用顺序了,哪个函数先定义,哪个函数后定义,都无所谓了。

    而在实际开发中,几千上万行、百万行的代码很常见,将这些代码都放在一个源文件中不仅检索麻烦,而且打开文件慢,所以必须将这些代码分散到多个文件中。对于多个文件的程序,通常是将函数定义放到源文件(.c文件)中,将函数的声明放到头文件(.h文件)中,使用函数时引入对应的头文件就可以,编译器会在链接阶段找到函数体。

    我们在使用 printf()、puts()、scanf() 等函数时引入了 stdio.h 头文件,很多初学者认为 stdio.h 中包含了函数定义(也就是函数体),只要有了头文件就能运行,其实不然,头文件中包含的都是函数声明,而不是函数定义,函数定义都放在了其它的源文件中,这些源文件已经提前编译好了,并以动态链接库或者静态链接库的形式存在,只有头文件没有系统库的话,在链接阶段就会报错,程序根本不能运行。

    展开全文
  • C语言函数原型的重要性

    千次阅读 2012-07-27 11:26:58
    from: http://xanpeng.github.com/programming/2012/07/11/func-prototype-c.html ...这里说的函数原型是function prototype, 也就是函数声明, 是程序告诉gcc函数样貌的一种方式.

    from: http://xanpeng.github.com/programming/2012/07/11/func-prototype-c.html





    本文涉及:
    1. 隐式声明的危害.
    2. gcc的built-in函数.

    这里说的函数原型是function prototype, 也就是函数声明, 是程序告诉gcc函数样貌的一种方式.
    我们知道, 如果在使用函数之前, 没有提供原型声明, 那么gcc只好根据调用掉吗做隐式声明.
    隐式声明是靠不住的, 因为是由gcc根据调用推导出来的, 因而可能和程序员意图不符合. 并且, 最重要地, gcc默认返回值是int类型, 这样可能有严重的后果. 看下面的例子:

    #include <errno.h>
    #include <stdio.h>
     
    int main(int argc, char *argv[]) {
        FILE *fp;
     
        fp = fopen(argv[1], "r");
        if (fp == NULL) {
            fprintf(stderr, "%s\n", strerror(errno));
            return errno;
        }
     
        printf("file exist\n");
        
        fclose(fp);
        return 0;
    }
    

    不使用和使用-Wall编译选项, 以及执行的结果如下:

    # make test
    cc     test.c   -o test
    
    # gcc -Wall test.c -o test
    test.c: In function ‘main’:
    test.c:9: warning: implicit declaration of function ‘strerror’
    test.c:9: warning: format ‘%s’ expects type ‘char *’, but argument 3 has type ‘int’
    
    # ./test
    Segmentation fault
    

    可以看出, strerror()的隐式声明返回值被认为是int, 但实际上strerror返回的是一个字符串的地址, 在64位机器上, 地址值大小为8个字节, int值大小是4个字节(x86_64是LP-64模型), 所以strerror()返回时地址值被截断, 产生一个invalid的地址值, 于是必然segfualt.
    解决办法很简单, 通过#include <string.h>给出显式声明即可.

    再看另一个例子, 同样是没有提供函数原型声明, 只不过这次是malloc()和free().

    #include <stdio.h>
    
    int main(void) {
        int *p = malloc(sizeof(int));
        
        if (p == NULL) {
            perror("malloc()");
            return -1;
        }
    
        *p = 10;
        free(p);
        return 0;
    }
    

    根据上面的思路, 照理说, malloc()在返回时, 真正的地址值要被截断, 然后赋给指针p, 这个值是非法的, 那么下面更改*p就会segfault. 但实际情况并非如此, 至于为什么, 还不得而知.
    不过, 这次编译的warning有些特别:

    # gcc -o test test.c
    test.c: In function ‘main’:
    test.c:5: warning: incompatible implicit declaration of built-in function ‘malloc’
    test.c:13: warning: incompatible implicit declaration of built-in function ‘free’
    
    # gcc -Wall -o test test.c
    test.c: In function ‘main’:
    test.c:5: warning: implicit declaration of function ‘malloc’
    test.c:5: warning: incompatible implicit declaration of built-in function ‘malloc’
    test.c:13: warning: implicit declaration of function ‘free’
    test.c:13: warning: incompatible implicit declaration of built-in function ‘free’
    
    # gcc test.c -o test -Wall -fno-builtin
    test.c: In function ‘main’:
    test.c:5: warning: implicit declaration of function ‘malloc’
    test.c:5: warning: initialization makes pointer from integer without a cast
    test.c:13: warning: implicit declaration of function ‘free’
    

    亮点在于warning中的"built-in function", gcc的built-in函数是一些在编译期间就被计算完成的辅助函数, 比如知名的likely()和unlikely(), 它们在编译期间就被替换为特定的处理方式.
    gcc文档给出了built-in函数列表. 也可以使用-fno-builtin取消使用.

    --EOF--

    展开全文
  • C语言函数原型fgets fputs

    千次阅读 2009-08-17 15:46:00
    fputsint fputs ( const char * str, FILE * stream );Write string to streamWrites the string pointed by str to the stream.The function begins copying from the address specified (str) until it reac

    fputs

    int fputs ( const char * str, FILE * stream );

    Write string to stream

    Writes the string pointed by str to the stream.
    The function begins copying from the address specified (str) until it reaches the terminating null character ('/0'). This final null-character is not copied to the stream.

     

    Parameters

    str
    An array containing the null-terminated sequence of characters to be written.
    stream
    Pointer to a FILE object that identifies the stream where the string is to be written.

     

    Return Value

    On success, a non-negative value is returned.
    On error, the function returns
    EOF.

     

    Example

     

     #include <stdio.h> int main () { FILE * pFile; char sentence [256]; printf ("Enter sentence to append: "); fgets (sentence,255,stdin); pFile = fopen ("mylog.txt","a"); fputs (sentence,pFile); fclose (pFile); return 0; } 

     

    This program allows to append a line to a file called mylog.txt each time it is run.

    fgets 

     

    char * fgets ( char * str, int num, FILE * stream ); 
    <cstdio> 

     

    Get string from stream

    Reads characters from stream and stores them as a C string into str until (num-1) characters have been read or either a newline or a the End-of-File is reached, whichever comes first.
    A newline character makes fgets stop reading, but it is considered a valid character and therefore it is included in the string copied to str.
    A null character is automatically appended in str after the characters read to signal the end of the C string.

     

    Parameters

    str
    Pointer to an array of chars where the string read is stored.
    num
    Maximum number of characters to be read (including the final null-character). Usually, the length of the array passed as str is used.
    stream
    Pointer to a FILE object that identifies the stream where characters are read from.
    To read from the standard input, stdin can be used for this parameter.

     

    Return Value

    On success, the function returns the same str parameter.
    If the End-of-File is encountered and no characters have been read, the contents of str remain unchanged and a null pointer is returned.
    If an error occurs, a null pointer is returned.
    Use either
    ferror or feof to check whether an error happened or the End-of-File was reached.

     

    Example

     

     #include <stdio.h> int main() { FILE * pFile; char mystring [100]; pFile = fopen ("myfile.txt" , "r"); if (pFile == NULL) perror ("Error opening file"); else { fgets (mystring , 100 , pFile); puts (mystring); fclose (pFile); } return 0; } 

     

    This example reads the first line of myfile.txt or the first 100 characters, whichever comes first, and prints them on the screen.

    展开全文
  • C语言函数的声明以及函数原型C语言把括号、赋值、强制类型转换等都作为运算符处理。那么大家知道C语言函数的声明以及函数原型是什么呢?下面来看看!C语言代码由上到下依次执行,原则上函数定义要出现在函数调用之前,...

    C语言函数的声明以及函数原型

    C语言把括号、赋值、强制类型转换等都作为运算符处理。那么大家知道C语言函数的声明以及函数原型是什么呢?下面来看看!

    C语言代码由上到下依次执行,原则上函数定义要出现在函数调用之前,否则就会报错。但在实际开发中,经常会在函数定义之前使用它们,这个时候就需要提前声明。

    所谓声明(Declaration),就是告诉编译器我要使用这个函数,你现在没有找到它的定义不要紧,请不要报错,稍后我会把定义补上。

    函数声明的格式非常简单,相当于去掉函数定义中的函数体再加上分号;,如下所示:

    返回值类型 函数名( 类型 形参, 类型 形参… );

    也可以不写形参,只写数据类型:

    返回值类型 函数名( 类型, 类型…);

    函数声明给出了函数名、返回值类型、参数列表(参数类型)等与该函数有关的信息,称为函数原型(Function Prototype)。

    函数原型的作用是告诉编译器与该函数有关的信息,让编译器知道函数的存在,以及存在的形式,即使函数暂时没有定义,编译器也知道如何使用它。

    有了函数声明,函数定义就可以出现在任何地方了,甚至是其他文件、静态链接库、动态链接库等。

    上节给出了计算sum = 1! + 2! + 3! + ... + (n-1)! + n!的代码,这节我们稍作修改,将 factorial() 和 sum() 函数的定义放到 main() 函数后面,请看下面的代码:

    #include // 函数声明long factorial(int n); //也可以写作 long factorial(int);long sum(long n); //也可以写作 long sum(long);int main(){ printf("1!+2!+...+9!+10! = %ld

    ", sum(10)); return 0;}//求阶乘long factorial(int n){ int i; long result=1; for(i=1; i<=n; i++){ result *= i; } return result;}// 求累加的和long sum(long n){ int i; long result = 0; for(i=1; i<=n; i++){ //嵌套调用 result += factorial(i); } return result;}

    运行结果:

    1!+2!+...+9!+10! = 4037913

    我们知道,使用 printf()、puts()、scanf()、get) 等函数要引入 stdio.h 这个头文件,很多初学者认为 stdio.h 中包含了函数定义(也就是函数体),只要有了头文件程序就能运行。其实不然,头文件中包含的都是函数声明,而不是函数定义,函数定义都在系统库中,只有头文件没有系统库在链接时就会报错,程序根本不能运行。

    最后再补充一点,函数原型给出了使用该函数的'所有细节,当我们不知道如何使用某个函数时,需要查找的是它的原型,而不是它的定义,我们往往不关心它的实现。

    展开全文
  • C语言函数指针和指针函数在学习C语言的过程中,“指针函数”和“函数指针”经常容易搞混了, 最简单的辨别方式就是看函数名前边的指针*星号是有没有被()包含,如果被包含了就是函数指针,反之则是指针函数。...
  • C语言函数声明以及函数原型

    千次阅读 2020-02-24 13:47:56
    C语言代码由上到下依次执行,原则上函数定义要出现在函数调用之前,否则就会报错。但在实际开发中,经常会在函数定义之前使用它们,这个时候就需要提前声明。 函数声明(Declaration),就是告诉编译器我要使用这个...
  • C语言函数的声明以及函数原型

    千次阅读 2019-07-02 20:45:58
    C语言代码由上到下依次执行,原则上函数定义要出现在函数调用之前,否则就会报错。但在实际开发中,经常会在函数定义之前使用它们,这个时候就需要提前声明。 所谓声明(Declaration),就是告诉编译器我要使用这个...
  • C语言函数原型

    2016-09-28 14:05:00
    http://blog.csdn.net/aisajiajiao/article/details/17385081 ... 函数原型告诉编译器函数的参数个数,参数类型以及函数的返回类型.通过使用这些信息,编译器反复校对(cross check)函数定义与函数调用的参数...
  • C语言函数

    2020-01-30 22:00:56
    关于C语言函数 C语言函数 介绍C语言中函数的三种情况,先通过一个简单的示例说明,代码如下: 函数原型(prototype) 如图,;函数原型告知编译器在程序中要使用该函数。函数原型是一种声明形式,告知编译器正在...
  • c语言printf函数原型C and C++ programming language a printffunction that is used to print given values or data to the standard output or current terminal. printf() functionsupports different formatting...
  • C语言函数原型的重要性

    千次阅读 2013-12-17 22:34:48
    函数原型告诉编译器函数的参数个数,参数类型以及函数的返回类型.通过使用这些信息,编译器反复校对(cross check)函数定义与函数调用的参数及其数据类型.如果我们忽略了函数原型,程序可能会带着警告编译通过,且可能会...
  • strcmp函数原型 C语言

    2020-12-16 17:32:24
    strcmp函数原型 问题描述 编写函数原型为“int strcmp(char s1,char s2);”的函数,该函数实现两个字符串的比较。 strcmp函数是string compare(字符串比较)的缩写,用于比较两个字符串并根据比较结果返回整数。基本...
  • C语言 函数

    千次阅读 2017-08-24 09:34:37
    结构化编程标准 1)程序控制流尽可能简单 2)应该自顶向下地设计程序结构 自顶向下设计(top-down design),也称逐步细化(stepwise refinement),把一个问题分解为几个小问题的组成. ...C语言函数语法 type function...
  • 所谓函数原型,又称函数声明,就是在调用这个函数之前要先声明一下这个函数,才能让别的函数能够访问到它(如果这个函数定义在调用它的代码块的前面则不用声明) C语言和C++都保留了函数声明这一需求,在声明时都有...
  • 可以通过给手册查找C语言常用函数原型,及其使用例子,非常好用,
  • C到Pascal函数原型翻译

    2012-08-03 16:53:38
    C语言函数原型翻译成Pascal语言函数原型 我在用DELPHI开发过程中,遇到调用DLL中的C语言写的函数, 我用JavaScript编写解决把函数原形从C语言翻译到Pascal语言 使用的编译技术是 正规LR(1) 这是我在使用中积累的一...
  • C语言函数声明

    2015-06-05 11:22:42
    C语言中,函数声明称为函数原型(function prototype)。使用函数原型是ANSI C的一个重要特点。它的作用主要是利用它在程序的编译阶段对调用函数的合法性进行全面检查。 说明: 以前的C版本的函数声明方式不是...
  • strrchr C语言函数

    2014-09-17 15:06:08
    C语言函数编辑 函数简介 函数名称: strrchr 函数原型:char *strrchr(const char *str, char c); 所属库: string.h 函数功能:查找一个字符c在另一个字符串str中末次出现的位置(也就是从str的右侧开始查找...
  • C语言中一个函数一般由两个部分组成一个是函数头,一个是函数体,函数体是编程语言中定义一个函数功能的所有代码组成的整体,函数头是指函数体之前的所有部分,应用于数学、程序设计领域,作用是给出了该函数的...
  • C语言函数传参汇总

    千次阅读 多人点赞 2016-06-19 19:11:04
    关于C语言函数传参现在汇总于下: 数据原型 应用 调用格式 声明格式 int arr[3] 等价传递 foo(arr,3) foo(int *p,int n) int arr[3][4] 等价传递 foo(arr,3) foo(int(*p)[4],int n) int *p 等价传递 ...
  • C语言函数作为函数参数

    千次阅读 多人点赞 2019-09-13 11:35:15
    c,c++中是可以向Python那样将函数作为函数参数的,具体实现方法如下
  • C语言函数 bzero

    千次阅读 2014-11-27 10:20:48
    函数原型:extern void bzero(void* s,int n); 函数功能:将字节字符串 s 的前n个字节置为0(包括‘\0’); 头文件:#include 说明:bzero函数是将s的前n个字符置为零,听起来是不是跟memset函数的功能...
  • 【C语言初学总结】--- C语言函数

    千次阅读 多人点赞 2019-10-15 17:33:28
    【C语言初学总结】 C语言函数 函数 1.函数的定义 函数定义就是函数体的实现,函数体就是一个代码块,他在函数调用执行时,与函数定义相反,函数声明出现在函数被调用的地方。 1.1函数注意点: 每条语句后边必须要有;...
  • 【C语言总结】C语言函数

    千次阅读 2018-02-08 22:00:10
    函数定义函数定义就是函数体的实现,函数体就是一个代码块,它在函数调用时执行,与函数定义相反,函数声明出现在函数被调用的地方。函数定义的语法: 类型 函数名(形式参数) 代码块代码块就是一对花括号,...
  • C语言 函数 数组

    千次阅读 2018-01-25 22:01:26
    (1)static在修饰main和普通函数中的变量时,都是修饰局部变量,为什么普通函数中的变量可以保持,main中变量不保持? static修饰局部变量时,变量存放在栈区,生命周期随着语句块执行结束而结束。但使用static...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 67,814
精华内容 27,125
关键字:

c语言函数原型

c语言 订阅