A. 结构体函数,是声明在主函数外的,有时候是不是要另建文件存放结构体在函数中是怎么调用的
对于公用的结构体和函数的声明,都需要放在独立的头文件中,组织的原则是实现同一个功能的结构体定义和函数声明都放在同一个头文件中,如下面的这个双链表头文件:
#ifndef _DLIST_H
#define _DLIST_H 1
#include <stdbool.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef struct _DListNode
{
struct _DListNode *prev;
struct _DListNode *next;
void *data;
} DListNode;
typedef struct _DList
{
DListNode *head;
DListNode *tail;
void (*destroy) (void *data);
int size;
} DList;
typedef void (*DList_PrintNodeFunc) (void *data);
typedef int (*DList_VisitNodeFunc) (void *context,void *data);
extern void dlist_init(DList *dlist,void (*destroy) (void *data));
extern int dlist_insert(DList *dlist,void *data);
extern int dlist_append(DList *dlist,void *data);
extern bool dlist_contain(const DList *dlist,const DListNode *node);
extern int dlist_insert_before(DList *dlist,DListNode *node,void *data);
extern int dlist_append_after(DList *dlist,DListNode *node,void *data);
extern int dlist_remove_node(DList *dlist,DListNode *node);
extern void dlist_print(DList *dlist,DList_PrintNodeFunc print);
extern int dlist_foreach(DList *dlist,DList_VisitNodeFunc visit,void *ctx);
#define dlist_head(dlist) ((dlist)->head)
#define dlist_tail(dlist) ((dlist)->tail)
#define dlist_size(dlist) ((dlist)->size)
#define dlistnode_data(node) ((node)->data)
#define dlistnode_prev(node) ((node)->prev)
#define dlistnode_next(node) ((node)->next)
#ifdef __cplusplus
}
#endif
#endif /* _DLIST_H */
对应于该头文件的函数实现存放在C或C++代码文件中。
而对于不需对外公开的结构和函数声明可以和直接调用这些结构或函数的函数放在一起,这种情况下函数的声明最好加static关键字修饰,表明函数的可见范围仅限与定义该函数的代码文件
如下所示
#include <stdio.h>
typedef struct _mystruct
{
type var1;
type var2;
} Mystruct;
static void myfunc(void)
{
Mystruct mstu;
//Do something here
}
int main (void)
{
myfunc();
return 0;
}
对结构体的调用需要区别是结构体变量还是结构体指针,如果传入参数是结构体变量本身,则需要使用"."操作符引用其成员,如Point结构体有int x、int y两个变量,结构体变量为p,则需要通过p.x引用x成员变量,p.y引用y成员变量,如果参数是结构指针,即ptr执向结构体p,则需要使用ptr->x引用x成员变量,ptr->y引用y成员变量
B. c++中const定义的变量或函数存储在哪里
编译后,存储在exe文件中。
C. Matlab中m文件,函数文件,脚本文件的区别
MATLAB中有一种文件叫M文件,他就是一系列代码组成的一个扩展名为.m的文件,虽然M文件是简单的ASCII型的文本文件,但是和其语法和高级语言一样,是一种程序化的编程语言。
M文件可分为脚本文件(MATLAB scripts)和函数文件(MATLAB functions)。脚本文件是包含多条MATLAB命令的文件;函数文件可以包含输入变量,并把结果传送给输出变量,两者的简要区别如下:
脚本文件
1.多条命令的综合体
2.没有输入、输出变量
3.使用MATLAB基本工作空间
4.没有函数声明行
函数文件
1.常用于扩充MATLAB函数库
2.可以包含输入、输出变量
3.运算中生成的所有变量都存放在函数工作空间
4.包含函数声明行
脚本文件可以理解为简单的M文件,脚本文件中的变量都是全局变量。函数文件是在脚本文件的基础之上多添加了一行函数定义行,其代码组织结构和调用方式与对应的脚本文件截然不同。函数文件是以函数声明行“function...”作为开始的,其实质就是用户往MATLAB函数库里边添加了子函数,函数文件中的变量都是局部变量,除非使用了特别声明。函数运行完毕之后,其定义的变量将从工作区间中清除。而脚本文件只是将一系列相关的代码结合封装,没有输入参数和输出参数,即不自带参数,也不一定要返回结果。而多数函数文件一般都有输入和输出变量,并见有返回结果。
D. c和c++中的库函数存储在库文件中,请问怎么查看库文件后缀名是什么放在哪儿(我用vc+
库函数已经被编译了,看不到源文件,它们的函数原型都在头文件中,头文件的后缀是h,如三角函数的原型都在头文件math.h中
E. c语言中我想要把函数分成几个不同的文件存放
在主函数中定义全局变量,例如
int gVal;
在其它文件中需要用到这个变量时,用下面的语句声明
extern int gVal;
F. Oracle中存储过程和函数的区别
定义:
存储过程(Stored Procere )是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程
带有参数)来执行它。
存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。
存储过程是由流控制和SQL 语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,应用程序使用时只要调用即可。
在ORACLE 中,若干个有联系的过程可以组合在一起构成程序包。
优 点:
1. 存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2.当对数据库进行复杂操作时(如对多个表进行Update、Insert、Query、Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
3.存储过程可以重复使用,可减少数据库开发人员的工作量。
4.安全性高,可设定只有某用户才具有对指定存储过程的使用权。
存储过程与函数的对比
存储过程的优缺点
优点:减少网络交互的成本。
缺点:
a、不可移植性,每种数据库的内部编程语法都不太相同,当你的系统需要兼容多种数据库时,最好不要用存储过程。
b、学习成本高,DBA一般都擅长写存储过程,但并不是每个程序员都能写好存储过程,除非你的团队有较多的开发人员熟悉写存储过程,否则后期系统维护会产生问题。
c、业务逻辑多处存在,采用存储过程后也就意味着你的系统有一些业务逻辑不是在应用程序里处理,这种架构会增加一些系统维护和调试成本。
d、存储过程和常用应用程序语言不一样,它支持的函数及语法有可能不能满足需求,有些逻辑就只能通过应用程序处理。
e、如果存储过程中有复杂运算的话,会增加一些数据库服务端的处理成本,对于集中式数据库可能会导致系统可扩展性问题。
f、为了提高性能,数据库会把存储过程代码编译成中间运行代码(类似于java的class文件),所以更像静态语言。当存储过程引用的对像(表、视图等等)结构改变后,
存储过程需要重新编译才能生效,在24*7高并发应用场景,一般都是在线变更结构的,所以在变更的瞬间要同时编译存储过程,这可能会导致数据库瞬间压力上升引起故障(Oracle数据库就存在这样的问题)。
G. C语言数据文件有几种存储方式每种存储形式各有什么特点
一、auto auto称为自动变量。 局部变量是指在函数内部说明的变量(有时也称为自动变量)。用关键字auto进7行说明, 当auto省略时, 所有的非全程变量都被认为是局部变量, 所以auto实际上从来不用。 局部变量在函数调用时自动产生, 但不会自动初始化, 随函数调用的结束, 这个变量也就自动消失了, 下次调用此函数时再自动产生, 还要再赋值, 退出时又自动消失。 二、static static称为静态变量。根据变量的类型可以分为静态局部变量和静态全程变量。 1. 静态局部变量 它与局部变量的区别在于: 在函数退出时, 这个变量始终存在, 但不能被其它、函数使用, 当再次进入该函数时, 将保存上次的结果。其它与局部变量一样。 2. 静态全程变量 Turbo C2.0允许将大型程序分成若干独立模块文件分别编译, 然后将所有模块的目标文件连接在一起, 从而提高编译速度, 同时也便于软件的管理和维护。静态全程变量就是指只在定义它的源文件中可见而在其它源文件中不可见的变量。它与全程变量的区别是: 全程变量可以再说明为外部变量(extern), 被其它源文件使用,而静态全程变量却不能再被说明为外部的, 即只能被所在的源文件使用。 三、extern extern称为外部变量。为了使变量除了在定义它的源文件中可以使用外, 还要被其它文件使用。因此, 必须将全程变量通知每一个程序模块文件, 此时可用extern来说明。 四、register register称为寄存器变量。它只能用于整型和字符型变量。定义符register说明的变量被Turbo C2.0存储在CPU的寄存器中, 而不是象普通的变量那样存储在内存中, 这样可以提高运算速度。但是Turbo C2.0只允许同时定义两个寄存器变量,一旦超过两个, 编译程序会自动地将超过限制数目的寄存器变量当作非寄存器变量来处理。因此, 寄存器变量常用在同一变量名频繁出现的地方。另外, 寄存器变量只适用于局部变量和函数的形式参数, 它属于auto型变量,因此, 不能用作全程变量。定义一个整型寄存器变量可写成: register int a;
H. 存储过程和函数的区别
一、含义不同
1、存储过程:存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。
2、函数:是由一个或多个 SQL 语句组成的子程序,可用于封装代码以便重新使用。函数限制比较多,如不能用临时表,只能用表变量等
二、使用条件不同
1、存储过程:可以在单个存储过程中执行一系列 SQL 语句。而且可以从自己的存储过程内引用其它存储过程,这可以简化一系列复杂语句。
2、函数:自定义函数诸多限制,有许多语句不能使用,许多功能不能实现。函数可以直接引用返回值,用表变量返回记录集。但是,用户定义函数不能用于执行一组修改全局数据库状态的操作。
三、执行方式不同
1、存储过程:存储过程可以返回参数,如记录集,函数只能返回值或者表对象。存储过程的参数有in,out,inout三种,存储过程声明时不需要返回类型。
2、函数:函数参数只有in,而函数需要描述返回类型,且函数中必须包含一个有效的return语句。