精华内容
下载资源
问答
  • 2021-05-18 15:42:23

    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 中包含了函数定义(也就是函数体),只要有了头文件程序就能运行。其实不然,头文件中包含的都是函数声明,而不是函数定义,函数定义都在系统库中,只有头文件没有系统库在链接时就会报错,程序根本不能运行。

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

    更多相关内容
  • 函数原型声明

    2022-04-28 21:02:48
    如果使用一个函数不对其进行原型声明就直接调用,编译器在碰到调用该函数的代码时就会猜测该调用函数的返回值类型和参数类型以及参数个数,如果猜的和函数的定义不符,编译器就会报错。有的编译器不一定会报错,这与...

    1.基本格式:

    函数原型声明的格式:函数头,以分号结尾,如下:

    void sum(int x,int y);
    

    2.函数原型声明的作用:

    告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。 函数的声明一般出现在函数的使用之前,要满足先声明后使用。如果使用一个函数不对其进行原型声明就直接调用,编译器在碰到调用该函数的代码时就会猜测该调用函数的返回值类型和参数类型以及参数个数,如果猜的和函数的定义不符,编译器就会报错。有的编译器不一定会报错,这与C99的执行力度有关。

    3.函数原型声明的使用:

    在实际开发中,函数的原型声明通常是放在头文件中的,而函数的具体定义通常是放在另一个.c文件中的,然后在主函数所在的.c文件中使用所定义的函数时,只需要include函数的原型声明所在的头文件即可,这就相当于进行原型声明了,然后再导入静态库即可,这就相当于函数的定义。如图所示:

    • add函数的原型声明单独存放在一个.h文件中:
      在这里插入图片描述

    • add函数的具体实现单独存放在一个.c文件中
      在这里插入图片描述

    • 在主函数中使用add函数时需要对其进行原型声明,即包含add.h这个头文件,由于这个add函数是我们自定义的,故包含其原型声明所在头文件时,用双引号。同时也要导入静态库。
      在这里插入图片描述

    在实际开发中add.c和add.h我们称之为一个模块,即我们将加法这个功能模块拆成了两部分,在实际开发中,将一个功能模块拆成两部分主要有两方面的好处:

    • 方便在公司中进行分工合作 ,每人负责一或两个模块
    • 有些功能模块我们不愿意让人看见它的源码,我们可以将该功能模块的.c和.h文件封装成一个静态库,也就是.lib文件,它是一个二进制文件,用记事本打开后是乱码的,别人无法看见这个功能模块的具体实现,如果我们需要将该段代码给别人使用或者卖代码,只需给出.lib文件和.h文件即可,.h文件告诉别人这个功能模块是干嘛用的,别人使用该函数时,需要包含该头文件,.lib文件包含函数的具体实现,在使用这个函数时,.lib文件需要被导入
    展开全文
  • 函数定义、函数声明函数原型

    千次阅读 2021-04-07 10:38:01
    函数定义带有函数体,函数声明函数原型 void threeline(void); 当函数声明宣示了函数的名字、参数类型和个数、返回值类型,它就叫函数原型。 只有带函数体的才叫定义。函数体后头不加;号 函数原型后面由分号;...

    函数定义、函数声明、函数原型;变量声明、变量定义;类型声明、类型定义

    1.函数定义、函数声明、函数原型

    函数声明中不但包含“函数原型声明”,也包含“函数定义”和老式的“函数类型声明”。

    • 函数类型声明(Function type declaration)。声明了函数名是一个函数及其返回值的类型。(没对参数进行描述)
    • 函数原型式的函数类型声明:声明了函数名返回值的类型参数的类型(和个数)
    • 函数定义:写了函数体的函数声明。不过函数体结束不带;

    函数定义带有函数体,函数声明≈函数原型
     

    • 函数声明宣示了函数的名字参数类型个数返回值类型,它就叫函数原型式声明,即函数原型
    • 只有带函数体的声明才叫定义
    • 函数定义本身就是一种函数声明只不过其函数体后不加;
    `不带函数体的函数声明`应该如何称呼呢?在C语言中,它们叫被做“函数类型
    声明”(Function type declaration)。`函数类型声明`最主要的特点是声明了
    `函数名`是一个函数及其`返回值的类型`,如果也声明了参数的类型,则是
    `函数原型`式的函数类型声明。现代的C语言的函数定义和函数类型声明
    都采用函数原型式的风格,C99把旧的非原型形式视为过时。
    
    • 函数原型后面由分号;结尾。
    • 由于有 Old Style C 语法的存在,并非所有函数声明都包含完整的函数原型void threeline();这个声明并没有明确指出参数类型和个数,所以不算函数原型。

    函数原型式声明:

    int fun(int a, int b); // 函数名字fun,返回类型 int,有2个int 参数
    

    函数原型式声明:

    int fun(int, int); // 函数名字fun,返回类型 int,有2个int 参数
    

    函数原型式声明:

    fun(int, int); // 函数名字fun,默认返回类型(其实也是int),有2个int 参数
    

    例如函数声明和定义:

    int fun(int a, int b) 
    {
    	return a+b;
    }// 花括号里是函数体,结束处没有分号,有形参名。
    

    在这里插入图片描述

    知识点:函数定义也具有对函数名的类型加以说明的效果,因此从这个意义上来说,函数定义也是一种对函数类型的说明。这种办法可以检查出函数调用时在参数个数和类型方面的错误。
     
    但是,用这种办法说明函数名并不好,因为这样做在编程时还需要考虑应该把哪个函数定义写在前面,哪个写在后面的问题。假如函数A调用函数B,函数B调用函数C,函数C又调用函数A,究竟如何安排函数定义的顺序就会让人感到无所适从。此外这种办法也不利于代码的组织,在由多个源文件组成的源程序时,这种写法就更会捉襟见肘、漏洞百出。因此,在1990年,C标准借鉴C++语言规定了一种新的说明函数名的方法,这就是函数原型(Function Propotype)式说明函数类型的方法。

    2.变量声明、变量定义

    • 只有分配存储空间的变量声明才叫变量定义
      其实函数也是一样,编译器只有见到函数定义才会生成指令,而指令在程序运行时当然也要占存储空间。那么没有函数体的函数声明有什么用呢?它为编译器提供了有用的信息,编译器在翻译代码的过程中,只有见到函数原型(不管带不带函数体)之后才知道这个函数的名字参数类型返回值,这样碰到函数调用时才知道怎么生成相应的指令,所以函数原型必须出现在函数调用之前,这也是遵循“先声明后使用”的原则。

    3.类型声明、类型定义

    声明一个类型是不分配存储空间的

    类型声明==“类型定义”
    
    展开全文
  • 必须在C中声明函数原型吗?

    千次阅读 2021-05-20 10:45:32
    必须在C中声明函数原型吗?这个问题已经在这里有了答案:C89,C90或C99中的所有功能都需要原型吗? 6个答案我是C语言的新手(我以前有Java,C#和一些C ++经验)。 在C语言中,是否需要声明一个函数原型,或者如果没有...

    必须在C中声明函数原型吗?

    这个问题已经在这里有了答案:

    C89,C90或C99中的所有功能都需要原型吗?                                     6个答案

    我是C语言的新手(我以前有Java,C#和一些C ++经验)。 在C语言中,是否需要声明一个函数原型,或者如果没有它,代码是否可以编译? 这样做是好的编程习惯吗? 还是仅取决于编译器? (我正在运行Ubuntu 9.10,并使用Code :: Blocks IDE下的GNU C编译器或gcc)

    10个解决方案

    65 votes

    既不需要在“旧” C(包括C89 / 90)中也不在新C(C99)中为C中的函数声明原型。 但是,C89 / 90和C99在函数声明方面有很大的不同。

    在C89 / 90中,根本不需要声明函数。 如果在调用时未声明该函数,则编译器从调用中传递的参数类型中隐式“猜测”(推断)声明,并假定返回类型为printf。

    例如

    int main() {

    int i = foo(5);

    /* No declaration for `foo`, no prototype for `foo`.

    Will work in C89/90. Assumes `int foo(int)` */

    return 0;

    }

    int foo(int i) {

    return i;

    }

    在C99中,必须在调用点之前声明调用的每个函数。 但是,仍然没有必要专门用原型声明它。 非原型声明也将起作用。 这意味着在C99中,“隐式printf”规则不再起作用(在这种情况下,对于推断的函数返回类型),但是如果在没有原型的情况下声明函数,仍可以从参数类型中猜测参数类型。

    由于在调用时未声明printf,因此上一个示例无法在C99中编译。 但是,您可以添加非原型声明

    int foo(); /* Declares `foo`, but still no prototype */

    int main() {

    int i = foo(5);

    /* No prototype for `foo`, although return type is known.

    Will work in C99. Assumes `int foo(int)` */

    return 0;

    }

    ...

    并以有效的C99代码结束。

    尽管如此,在调用函数之前声明一个函数原型总是一个好的习惯。

    补充说明:上面我说过,不需要声明函数原型。 实际上,对于某些功能是必需的。 为了在C语言中正确调用可变参数函数(例如printf),必须在调用点之前用原型声明该函数。 否则,行为是不确定的。 这适用于C89 / 90和C99。

    AnT answered 2020-01-01T12:29:15Z

    62 votes

    在ANSI C中(意味着C89或C90),您不必声明函数原型。 但是,最佳实践是使用它们。 该标准允许您不使用它们的唯一原因是为了与非常旧的代码向后兼容。

    如果没有原型,则调用函数,编译器将从传递给函数的参数中推断出原型。 如果稍后在同一编译单元中声明该函数,则该函数的签名与编译器的猜测结果不同时,将会出现编译错误。

    更糟糕的是,如果函数在另一个编译单元中,则无法获得编译错误,因为如果没有原型,就无法进行检查。 在这种情况下,如果编译器将其弄错,那么如果函数调用在堆栈中压入的类型与函数期望的类型不同,则可能会出现不确定的行为。

    惯例是始终在头文件中声明原型,该头文件与包含该函数的源文件同名。

    在C99或C11中,在调用任何函数之前,标准C需要在范围内声明函数。 除非您强迫他们这样做,否则许多编译器实际上并没有实施此限制。

    user308405 answered 2020-01-01T12:28:22Z

    6 votes

    如果函数在使用前已定义,则不是必须的。

    Drakosha answered 2020-01-01T12:29:36Z

    4 votes

    这不是必需的,但是不使用原型是一种不好的做法。

    使用原型,编译器可以验证您是否正确调用了该函数(使用正确的数量和参数类型)。

    如果没有原型,则可能有:

    // file1.c

    void doit(double d)

    {

    ....

    }

    int sum(int a, int b, int c)

    {

    return a + b + c;

    }

    还有这个:

    // file2.c

    // In C, this is just a declaration and not a prototype

    void doit();

    int sum();

    int main(int argc, char *argv[])

    {

    char idea[] = "use prototypes!";

    // without the prototype, the compiler will pass a char *

    // to a function that expects a double

    doit(idea);

    // and here without a prototype the compiler allows you to

    // call a function that is expecting three argument with just

    // one argument (in the calling function, args b and c will be

    // random junk)

    return sum(argc);

    }

    R Samuel Klatchko answered 2020-01-01T12:30:09Z

    2 votes

    在C语言中,如果我们不声明函数原型并使用函数定义,则没有问题,并且如果函数的返回类型为“整数”,则程序将编译并生成输出。 在所有其他情况下,都会出现编译器错误。 原因是,如果我们调用函数而不声明函数原型,则编译器将生成一个原型,该原型返回一个整数,并搜索相似的函数定义。 如果函数原型匹配,则编译成功。 如果返回类型不是整数,则函数原型不匹配,并且会生成错误。 因此,最好在头文件中声明函数原型。

    Raviteja answered 2020-01-01T12:30:31Z

    1 votes

    C允许调用函数,即使它们以前没有被声明过,但是我强烈建议您在使用所有函数之前为所有函数声明一个原型,这样,如果使用错误的参数,编译器可以为您节省时间。

    Anders Abel answered 2020-01-01T12:30:51Z

    1 votes

    您应该将函数声明放在头文件(X.h)中,将定义放在源文件(X.c)中。 然后其他文件可以#include "X.h"并调用该函数。

    cpalmer answered 2020-01-01T12:31:12Z

    1 votes

    根据C99标准,功能原型不是必需的。

    zoli2k answered 2020-01-01T12:31:32Z

    0 votes

    声明一个函数供调用代码进行编译不是绝对必要的。 虽然有一些警告。 假定未声明的函数返回int,并且编译器将首先发出警告:未声明的函数,然后发出有关返回类型和参数类型不匹配的警告。

    话虽如此,显然用原型正确声明函数是一种更好的做法。

    Nikolai Fetissov answered 2020-01-01T12:31:57Z

    -4 votes

    选择“选项”菜单,然后选择“编译器| C ++选项”。 在弹出的对话框中,选择“始终CPP”在“使用C ++编译器”选项中。再次选择“选项”菜单,然后选择“环境|编辑'。 确保默认扩展名为“ C”,而不是“ CPP”。

    user3725015 answered 2020-01-01T12:32:19Z

    展开全文
  • 下面重载乘法运算符的函数原型声明中正确的是: 正确答案: A B D 你的答案: D (错误) MyClass operator *(double ,MyClass); MyClass operator *(MyClass ,MyClass); MyClass operator *...
  • 函数原型&函数声明

    千次阅读 多人点赞 2019-02-20 09:53:36
    函数原型类似函数定义时的函数头,又称函数声明。为了能使函数在定义之前就能被调用,C++规定可以先说明函数原型,然后就可以调用函数。函数定义可放在程序后面。 由于函数原型是一条语句,因此函数原型必须以分号...
  • C语言函数声明以及函数原型

    千次阅读 多人点赞 2020-02-24 13:47:56
    但在实际开发中,经常会在函数定义之前使用它们,这个时候就需要提前声明函数声明(Declaration),就是告诉编译器我要使用这个函数,你现在没有找到它的定义不要紧,请不要报错,稍后我会把定义补上。 函数声明...
  • C++里声明函数原型的作用

    千次阅读 2018-11-08 23:02:14
    #include &lt;...// 这个声明函数原型的代码必须有, 如果没有的话会报use of undeclared identifier 'simon' 这个异常 void simon(double n); int main() { simon(3); cout &lt;&...
  • 函数原型,函数声明,函数定义三者之间的关系 函数原型指函数签名,函数名,返回类型和访问修饰符。函数签名指确定的参数数量及其类型。注意参数名可选,也就是可以不写形参名。 例如:void Sum(int a,int b); 或 ...
  • 所谓函数原型,又称函数声明,就是在调用这个函数之前要先声明一下这个函数,才能让别的函数能够访问到它(如果这个函数定义在调用它的代码块的前面则不用声明) C语言和C++都保留了函数声明这一需求,在声明时都有...
  • 函数原型 int power(int m, int n) 依次是 函数返回类型、函数名和形参列表 函数原型不需要函数体,也不需要形式参数的名字,用分号作为原型的结束符。 对于形参列表只需要 说明需要几个参数,分别为什么类型...
  • 函数原型和函数声明的区别

    万次阅读 2018-07-04 19:22:24
    函数原型:指明函数的名字,返回的类型,有几个参数,这几个参数是什么类型,不需要函数体,也不需要形式参数的名字,其中用分号作为原型的结束符。例如:int fun( int );第一个int指明返回的类型,第二个int指明...
  • C语言函数原型的作用

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

    千次阅读 2019-01-08 14:50:00
    函数原型声明、定义? 函数原型相当于函数声明,包括函数类型、函数名、形参列表(其中形参名可以省略),且不需要函数体,例如: int func_a(int a); double func_b(double b); 而函数定义则...
  • 函数声明、函数定义、函数原型 1.void threeline(void) 声明了一个函数的名字、参数类型和个数、返回值类型,这叫做函数原型 2.在代码中可以单独写一个函数原型,后面加;结束,没有函数体,如void threeline(void)...
  • VISADLL函数原型声明

    2010-08-27 17:40:37
    定义了安捷伦GPIB visa32.dll的delphi7代码的函数原型
  • C++函数原型(函数声明

    千次阅读 2015-10-11 19:20:57
      从Java到c++的学习之路!!    在Java中,只要方法...但是在C++中,如果在定义前就调用了,那么要有一个函数声明,也就是函数原型。   #include &lt;iostream&gt; using namespace std; vo...
  • C++中的函数原型和函数定义

    千次阅读 热门讨论 2020-08-30 14:44:23
    函数原型类似函数定义时的函数头,又称函数声明。函数声明由函数返回类型、函数名和形参列表组成。这三个元素被称为函数原型,函数原型描述了函数的接口。 函数原型在c++中就是函数声明,因为它定义了函数名、参数...
  • C++ 函数原型

    万次阅读 2017-04-01 09:58:40
    一,函数原型语法 函数原型是一条语句,因此必须使用分号结束。获得原型最简单的方法是复制函数定义中的函数头。函数原型不要求提供变量名,有类型列表就可以了。 二,为什么需要函数原型函数原型描述了函数到...
  • printf函数原型

    千次阅读 2017-09-15 14:44:59
    typedef char *va_list;#define _AUPBND (sizeof (acpi_native_int) - 1) #define _ADNBND (sizeof (acpi_native_int) - 1)#define _bnd(X, bnd) (((sizeof (X)) + (bnd)) & (~(bnd))) #define va_
  • 应注意:带有默认参数的函数,其默认参数应在声明时添加,实现时不能加。 void func(int a = 3); int main() { func(); return 0; } void func(int a) { …… } ...
  • c语言函数声明(c语言函数声明格式)

    千次阅读 2021-05-21 07:55:07
    thanks函数声明指函数原型声明,只有函数名,函数类型,参数个数和类型,无函数体。一般放在主函数前。逗号结尾。函数定义,除上述外,去掉结尾逗号,加函数体。可放在.函数定义就是规定函数的格式与功复能。函数...
  • 函数的“定义”和“声明”不是一回事。函数的定义是指对函数功能的确立,包括指定函数名,函数值类型、形参及其类型以及函数体等,它是一个完整的、独立的函数单位。而函数声明的作用则是把函数的名字,函数类型...
  • C++必须要有函数原型,C语言可选 1.1  C语言 1  #include 2   3  int main(intargc, char *argv[]) 4  { 5  func1(); 6  func2(); 7   return 0; 8  } 9   ...
  • 一、对被调用函数声明 1.如果使用自己定义的函数,而该函数的位置在调用它函数的后面,应该在主调函数中对被调用的函数声明 如:void B(int x,int y); //声明B 即在写函数声明时,可以简单的照写自己定义的...
  • 声明只需要编写一次,这样以后维护和修改时更加容易,同样,声明只编写一次消除了在多份拷贝中出现写法不一致的机会
  • 程序的声明部分都是服务于编译器的,函数原型也是如此。 函数原型描述了函数到编译器的接口。他将函数的返回值类型(如果有的话)以及参数的类型和数量告诉了编译器。 例如 double volume = cube(side); 首先...
  • C 函数声明, 函数原型, 函数定义

    千次阅读 2016-11-04 12:22:49
    函数声明的发展1 隐式函数声明 implicit function declaration main 函数和 printf 函数返回值类型为 int, 若不声明, 编译器默认函数返回值为 int 类型 C90标准起,这种写法就步入了被逐步抛弃的过程(尽管当时还没有...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 169,703
精华内容 67,881
关键字:

函数原型声明

友情链接: 粒子群优化算法.zip