C语言函数头怎么写,请问如何写一个C函数的头文件啊

1,请问如何写一个C函数的头文件啊你在b.c中用到了a.c中的函数,那么a.h中应当有这个函数的原型声明,然后在b.h中包含了a.h就可以用这个函数了#include<stdio.h>不知道你说的头文件是不是指的*.h文件如果是的话C里面一般不分这个C一般都把声明放在main的上头同一文件里
2,C语言中定义自定义库函数时该如何写对应的头文件没有强制规定,但一般遵循以下原则:1 功能类似或相关的一组函数写在同一个头文件中;2 头文件命名应简单,尽量短,但可以通过文件名得知内部函数功能;3 头文件名由数字、字母、下划线组成,不要有空白字符或其它符号;4 为防止头文件重复引用,或嵌套引用,头文件应使用条件编译包含;5 头文件中,应遵循先类型定义,后函数声明的顺序;6 当头文件函数声明中,用到其它头文件中定义的类型时,在头文件开始处进行引用 。跟标准库的头没关系,标准库的头文件随便你包含多少次都不会有问题的 。你把报错的提示给贴上来吧 。再看看别人怎么说的 。首先,要明白一点 。标准库的头文件多次include是不会发生重定义的错误的 。所有的标准库文件的内容都是如这般写的:#ifndef STDLIB_H#define STDLIB_H...#endif这保证了它的内容只会被引用一次 。所以要include,只写一句#include 就可以了 。另外,你自己的头文件最好也加上上面所示的那种保卫宏,以防多次引用你自己的头文件出现重定义 。你说的重复定义,可能是另外一个问题 。你说你自己做了一个库,如果你是用 Visual C 建工程生成的 lib 库文件,要注意项目属性里有一个 ”/Mt“ "/Md" 的选项 。请保证选的是后者,否则你的库文件中会有一套标准库的函数的实现,而使用你的库编译其他程序的时候,又会再次连接系统库 , 如此便会产生重定义 。#include "MyHead.h"来包含 。头文件是不编译的,因为C语言编译过程之前有个预编译过程 。在这个过程中用头文件中的内容替换源文件中“#include”命令,所以在编译器看来,没有头文件,只有源文件 。预编译过程还包括条件编译 。头文件为了防止被重复包含,通常的格式是:/* MyHead.h */#ifndef _MYHEAD_H_#define _MYHEAD_H_(这里是头文件的内容)#endif /* _MYHEAD_H_ */希望对你有帮助!
3 , 谁能教教我c语言的头文件怎么写啊以及怎么用用的Cfree写在比如你要写一个头文件叫utils.h , 里面声明了一个一个函数int add(int a, int b),那头文件里的内容是这样的:#ifndef UTILS_H#define UTILS_Hint add(int a, int b);#endif-------分割线------然后再创一个文件utils.c,里面定义函数add#include "utils.h"int add(int a, int b)return a + b;}-------分割线------然后假如你想在main.c里使用这个头文件,就把utils.h utils.c放到main.c所在的文件夹里,然后在main.c里这么写#include <stdio.h>#include "utils.h"void main(void)printf("%d", add(2,3)); //5}------分割线------上面有些不是硬性规定,但是希望你能遵守,养成好习惯,在头文件里面只声明,定义只写在.c里面还有,因为你现在有两个.c文件了 , 所以编译的时候不要忘了编译utils.c 。(.h是不用编译的)比如你要写一个头文件叫utils.h,里面声明了一个一个函数int add(int a, int b),那头文件里的内容是这样的:#ifndef UTILS_H#define UTILS_Hint add(int a, int b);#endif-------分割线------然后再创一个文件utils.c,里面定义函数add#include "utils.h"int add(int a, int b)return a + b;}-------分割线------然后假如你想在main.c里使用这个头文件,就把utils.h utils.c放到main.c所在的文件夹里,然后在main.c里这么写#include #include "utils.h" void main(void) { printf("%d", add(2,3)); //5 } ------分割线------ 上面有些不是硬性规定,但是希望你能遵守,养成好习惯,在头文件里面只声明,定义只写在.c里面 还有,因为你现在有两个.c文件了,所以编译的时候不要忘了编译utils.c 。(.h是不用编译的)【C语言函数头怎么写,请问如何写一个C函数的头文件啊】
4,C为下面的函数编写函数头1、函数声明double saleCommission(double,float);函数double saleCommission(double sales,float commissionRates)...return ...;}2、函数声明double printCalendar(int,int);函数void printCalendar(int year,int month)...}第一题:#include <stdio.h>#include <assert.h>#include <string.h>#include <stdlib.h>#include <ctype.h>void countcharater(char const * sztext) double percent[3]= int ilen=strlen(sztext);while (*sztext) if (isalpha(*sztext)) ++percent[0]; else if (isdigit(*sztext)) ++percent[1]; else ++percent[2]; ++sztext; } percent[0]/=ilen; percent[1]/=ilen; percent[2]/=ilen;printf("字母占%.2lf,数字占%.2lf,其他字符占%.2lf\n",percent[0],percent[1],percent[2]);}int main() char sztext[512]=printf("请输入一字符串:"); fgets(sztext,sizeof(sztext),stdin); sztext[strlen(sztext)-1]=0; countcharater(sztext); return 0;}第二题:#include <stdio.h>#include <assert.h>#include <string.h>#include <stdlib.h>#include <ctype.h>void getcharaterpos(char * sztext,char const ch) char *p=null; char buf[5]= sprintf(buf,"%c",ch); p=strstr(sztext,buf); if (p) printf("该字符在字符串的位置为%d.\n",p-sztext+1); else printf("未在该该字符串中找到该字符.\n");}int main() char sztext[512]= char ch=0; printf("请输入一字符串:\n"); fgets(sztext,sizeof(sztext),stdin); sztext[strlen(sztext)-1]=0; printf("请输入一字符:"); scanf("%c",&ch); getcharaterpos(sztext,ch); return 0;}不会5,C函数头格式第二个错了 。形参里面带赋值的叫缺省参数,也就是你如果在调用函数的时候不给它传值,就默认使用形参表的缺省值 。因为参数有可能有多个,所以,规定缺省参数必须从右至左 。就说第二个吧,假设你想使用a的缺省值 , 而给b另外传一个值是没有办法做到的,因为你的调用肯定会是 AA(3)编译器不能判断你这个3是传给a的还是传给b的,因为a虽然有缺省参数,但是它依然是可以接受传值的 。头文件头文件的所有内容,都必须包含在#ifndef#define//#endif这样才能保证头文件被多个其他文件引用(include)时 , 内部的数据不会被多次定义而造成错误inline限定符在头文件中,可以对函数用inline限定符来告知编译器,这段函数非常的简单,可以直接嵌入到调用定义之处 。当然inline的函数并不一定会被编译器作为inline来实现,如果函数过于复杂,编译器也会拒绝inline 。因此简单说来,代码最好短到只有3-5行的才作为inline 。有循环,分支,递归的函数都不要用做inline 。对于在类定义内定义实现的函数 , 编译器自动当做有inline请求(也是不一定inline的) 。因此在下边,我把带有inline限定符的函数成员和写在类定义体内的函数成员统称为“要inline的函数成员”非模板类型全局类型就像前面笼统的话讲的:申明写在.h文件 。对于函数来讲,没有实现体的函数,就相当于是申明;而对于数据类型(包括基本类型和自定义类型)来说,其申明就需要用extern来修饰 。然后在.cpp文件里定义、实现或初始化这些全局函数和全局变量 。不过导师一直反复强调:不许使用全局函数和全局变量 。用了之后造成的后果,目前就是交上去的作业项目会扣分 。当然不能用自有不能用的理由以及解决方案 , 不过不在目前的讨论范围内 。自定义类型对于自定义类型,包括类(class)和结构体(struct),它们的定义都是放在.h文件中 。其成员的申明和定义就比较复杂了 , 不过看上边的表格,还是比较清晰的 。函数成员函数成员无论是否带有static限定符,其申明都放在.h文件的类定义内部 。对于要inline的函数成员其定义放在.h文件;其他函数的实现都放在.cpp文件中 。数据成员数据成员的申明与定义都是放在.h文件的类定义内部 。对于数据类型,关键问题是其初始化要放在什么地方进行 。对于只含有static限定符的数据成员,它的初始化要放在.cpp文件中 。因为它是所有类对象共有的,因此必须对它做合适的初始化 。对于只含有const限定符的数据成员,它的初始化只能在构造函数的初始化列表中完成 。因为它是一经初始化就不能重新赋值,因此它也必须进行合适的初始化 。对于既含有static限定符,又含有const限定符的数据成员,它的初始化和定义同时进行 。它也是必须进行合适的初始化对于既没有static限定符,又没有const限定符的数据成员 , 它的值只针对本对象可以随意修改,因此我们并不在意它的初始化什么时候进行 。第二个是错的 。如果有默认参数的话,必须从最右边开始 。不允许出现右边没有默认参数而左边却有的情况 。C1、对2,3,4、错 。不能有 a=0, b=0 这种形式 。C++2、AA(int a=0,int b)错在一个函数定义中,函数体之前的所有部分称为函数头,它给出了该函数的返回类型、每个参数的次序和类型等函数原型信息,所以当没有专门给出函数原型说明语句时,系统就从函数头中获取函数原型信息 。一个函数的原型语句就是其函数头的一个拷贝,当然要在最后加上语句接上结束符分号 。函数原型语句与函数头也有细微的差别,在函数原型语句中,其参数表中的每个参数允许只保留参数类型,而省略参数名,并且若使用参数名也允许与函数头中对应的参数名不同 。全文如下:一)、定义格式<类型名> <函数名> ([<参数表>]) <函数体><类型名>为系统或用户已定义的一种数据类型 , 它是函数执行过程中通过return语句要求返回的值的类型,又称为该函数的类型 。当一个函数不需要通过return语句返回一个值时,称为无返回值函数或无类型函数 , 此时需要使用保留字void作为类型名 。当类型名为int时,可以省略不写,但为了清楚起见,还是写明为好 。<函数名>是用户为函数所起的名字,它是一个标识符,应符合C++标识符的一般命名规则,用户通过使用这个函数名和实参表可以调用该函数 。<参数表>又称形式参数表,它包含有任意多个(含0个,即没有)参数说明项,当多于一个时其前后两个参数说明项之间必须用逗号分开 。每个参数说明项由一种已定义的数据类型和一个变量标识符组成 , 该变量标识符成为该函数的形式参数,简称形参,形参前面给出的数据类型称为该形参的类型 。一个函数定义中的<参数表>可以被省略 , 表明该函数为无参函数 , 若<参数表>用void取代,则也表明是无参函数,若<参数表>不为空,同时又不是保留字void , 则称为带参函数 。<函数体>是一条复合语句,它以左花括号开始,到右花括号结束 , 中间为一条或若干条C++语句 。在一个函数的参数表中,每个参数可以为任一种数据类型 , 包括普通类型、指针类型、数组类型、引用类型等,一个函数的返回值可以是除数组类型之外的任何类型,包括普通类型、指针类型和引用类型等 。另外,当不需要返回值时,应把函数定义为void类型 。二)、定义格式举例(1) void f1() (2) void f2(int x) (3) int f3(int x,int* p) (4) char* f4(char a[])(5) int f5(int& x,double d) (6) int& f6(int b[10], int n) (7) void f7(float c[][N], int m, float& max) (8) bool f8(ElemType*& bt, ElemType& item) 在第一条函数定义中,函数名为f1,函数类型为void,参数表为空 , 此函数是一个无参无类型函数 。若在f1后面的圆括号内写入保留字void,也表示为无参函数 。在第二条函数定义中,仅带有一个类型为int的形参变量x,该函数没有返回值 。在第三条函数定义中,函数名为f3,函数类型为int,函数参数为x和p,其中x为int型普通参数 , p为int*型指针参数 。在第四条函数定义中,函数名为f4,函数类型为char*,即字符指针类型,参数表中包含一个一维字符数组参数 。注意:在定义任何类型的一维数组参数时 , 不需要给出维的尺寸,当然给出也是允许的,但没有任何意义 。在第五条函数定义中,函数名为f5 , 返回类型为int,该函数带有两个形参,一个为 整型引用变量x,另一个为双精度变量d 。在第六条函数定义中,函数名为f6,函数类型为int&,即整型引用 , 该函数带有两个形参,一个是整型数组b,另一个是整型变量n 。在这里定义形参数组b所给出的维的尺寸10可以被省略 。在第七条函数定义中,函数名为f7,无函数类型 , 参数表中包含三个参数,一个为二维单精度型数组c,第二个为整型变量m,第三个为单精度引用变量max 。注意:当定义一个二维数组参数时,第二维的尺寸必须给出,并且必须是一个常量表达式 , 第一维尺寸可给出也可不给出,其作用相同 。在第八条函数定义中,函数名为f8,返回类型为bool,即逻辑类型 , 该函数带有两个参数,一个为形参bt,它为ElemType的指针引用类型 , 另一个为形参item,它是ElemType的引用类型,其中ElemType为一种用户定义的类型或是通过typedef语句定义的一个类型的别名 。三)、有关函数定义的几点说明1. 函数原型语句在一个函数定义中,函数体之前的所有部分称为函数头,它给出了该函数的返回类型、每个参数的次序和类型等函数原型信息 , 所以当没有专门给出函数原型说明语句时,系统就从函数头中获取函数原型信息 。一个函数必须先定义或声明而后才能被调用,否则编译程序无法判断该调用的正确性 。一个函数的声明是通过使用一条函数原型语句实现的,当然使用多条相同的原型语句声明同一个函数虽然多余但也是允许的,编译时不会出现错误 。在一个完整的程序中,函数的定义和函数的调用可以在同一个程序文件中,也可以处在不同的程序文件中,但必须确保函数原型语句与函数调用表达式出现在同一个文件中,并且函数原型语句出现在前,函数的调用出现在后 。通常把一个程序中用户定义的所有函数的原型语句组织在一起,构成一个头文件 , 让该程序中所含的每个程序文件的开始(即所有函数定义之前)包含这个头文件(通过#include命令实现),这样不管每个函数的定义在哪里出现,都能够确保函数先声明后使用(即调用)这一原则的实现 。一个函数的原型语句就是其函数头的一个拷贝 , 当然要在最后加上语句接上结束符分号 。函数原型语句与函数头也有细微的差别,在函数原型语句中,其参数表中的每个参数允许只保留参数类型,而省略参数名,并且若使用参数名也允许与函数头中对应的参数名不同 。2. 常量形参在定义一个函数时,若只允许函数体访问一个形参的值,不允许修改它的值,则应把该形参说明为常量,这只要在形参说明的前面加上const保留字进行修饰即可 。如:void f9(const int& x, const char& y);void f10(const char* p, char key);在函数f9的函数体中只允许使用x和y的值 , 不允许修改它们的值 。在函数f10的函数体中只允许使用p所指向的字符对象或字符数组对象的值,不允许修改它们的值,但在函数体中既允许使用也允许修改形参key的值 。3. 缺省参数在一个函数定义中,可根据需要对参数表末尾的一个或连续若干个参数给出缺省值,当调用这个函数时,若实参表中没有给出对应的实参,则形参将采用这个缺省值 。如:void f11(int x, int y=0) int f12(int a[], char op=, int k=10) 函数f11的定义带有两个参数 , 分别为整型变量x和y,并且y带有缺省值0,若调用该函数的表达式为f11(a,b),将把a的值赋给x,把b的值赋给y,接着执行函数体;若调用该函数的表达式为f11(a+b),则也是正确的调用格式 , 它将把a+b的值赋给x,因y没有对应的实参,将采用缺省值0,参数传送后接着执行函数体 。函数f12的定义带有三个参数,其中后两个带有缺省值 , 所以调用它的函数格式有三种,一种只带一个实参,用于向形参a传送数据,后两个形参采用缺省值,第二种带有两个实参,用于分别向形参a和op传送数据,第三个形参采用缺省值,第三种带有三个实参 , 分别用于传送给三个形参 。若一个函数带有专门的函数原型语句,则形参的缺省值只能在该函数原型语句中给出 , 不允许在函数头中给出 。如对于上述的f11和f12函数,其对应的函数原型语句分别为:void f11(int x, int y=0);int f12(int a[], char op=, int k=10);函数定义应分别改写为:void f11(int x, int y) int f12(int a[], char op, int k) 4. 数组参数在函数定义中的每个数组参数实际上是指向元素类型的指针参数 。对于一维数组参数说明:<数据类型> <数组名>[]它与下面的指针参数说明完全等价:<数据类型> *<指针变量名>其中<指针变量名>就是数组参数说明中的<数组名> 。如对于f12函数定义中的数组参数说明int a[] , 等价于指针参数说明int* a 。也就是说,数组参数说明中的数组名a是一个类型为int*的形参 。注意:在变量定义语句中定义的数组,其数组名代表的是一个数组,它的值是指向第一个元素的指针常量 , 这与数组形参的含义有区别 。对于二维数组参数说明:<数据类型> <参数名>[][<第二维尺寸>]它与下面的指针参数说明完全等价:<数据类型> (*<参数名>)[<第二维尺寸>]如对于f7函数定义中的二维数组参数说明float c[][N],等价于指针参数说明float(*c)[N] 。5. 函数类型当调用一个函数时就执行一遍循环体,对于类型为非void的函数 , 函数体中至少必须带有一条return语句,并且每条return语句必须带有一个表达式,当执行到任一条return语句时,将计算出它的表达式的值 , 结束整个函数的调用过程,把这个值作为所求的函数值带回到调用位置,参与相应的运算;对于类型为void的函数,它不需要返回任何函数值,所以在函数体中既可以使用return语句,也可以不使用 , 对于使用的每条return语句不允许也不需要带有表达式,当执行到任一条return语句时,或执行到函数体最后结束位置时,将结束函数的调用过程,返回到调用位置向下继续执行 。6. 内联函数当在一个函数的定义或声明前加上关键字inline则就把该函数声明为内联函数 。计算机在执行一般函数的调用时 , 无论该函数多么简单或复杂,都要经过参数传递、执行函数体和返回等操作 。若把一个函数声明为内联函数后,在程序编译阶段系统就有可能把所有调用该函数的地方都直接替换为该函数的执行代码 , 由此省去函数调用时的参数传递和返回操作,从而加快整个程序的执行速度 。通常可把一些相对简单的函数声明为内联函数?