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語句。