1. 程式人生 > >C語言的連結屬性的個人理解

C語言的連結屬性的個人理解

C語言有3個連結屬性:extern(外部)、intern(內部)、none(無)。

屬於extern的識別符號無論宣告幾次,都表示幾個原始檔中或整個專案中同一個實體。

屬於intern的識別符號在一個原始檔中的多個宣告都表示同一個實體。

屬於none的識別符號有幾個宣告就有幾個實體,相互獨立。

全域性變數預設擁有external連結屬性;

static修飾的變數擁有internal連結屬性;

函式體中的變數用於none連結屬性。

函式宣告時也預設擁有extern連結屬性。

已有連結屬性的變數再新增任何連結屬性都無效(宣告的時候就賦予了連結屬性?),保持原連結屬性,但對預設情況下是extern連結屬性的識別符號除外,加上static關鍵字,會將其從extern變為intern(被其所屬原始檔私有),函式同樣也可以這樣:static int a( int b )。宣告區域性變數後,使用的也不再是擁有extern連結屬性的變數,而是這個新宣告的變數(擁有extern連結屬性的變數仍然可以在區域性變數作用域外的其它地方呼叫,其它.c或.cpp檔案呼叫時只需宣告並加上extern即可如:extern int b; printf( "%d\n",b );)。

注意這裡用的定義和之前用的宣告,定義變數和宣告變數是不同的,定義變數編譯器需要給他分配記憶體單元,而宣告變數則不用,所以extern int a,此時的a表示別處的原始檔定義過的a。變數或函式可以多次宣告,但只能定義一次。

當變數在不同原始檔都用到時(也就是需要具有extern連結屬性),最好第一次宣告就用extern關鍵字,儘管預設也表示是extern連結屬性,這樣有利於程式碼的可讀性。

有一個技巧,在一個.h檔案宣告多個函式,可以在一個.c或.cpp檔案中對它們進行定義,在另一個.c或.cpp檔案中對他們進行呼叫。



相關推薦

C語言引用&的個人理解

因為我學藝不精,所以有時候交換值函式時有時候會寫成下面這樣int main(int argc, const char * argv[]) { // insert code here... int x = 3; int y = 5;

C語言自學之指標理解

目的: 通過以下學習,希望能理解指標的概念,理解指標和陣列的關係,理解指標的定義,掌握指標的用法。 1. 簡述   用C語言寫的程式碼基本上都用到指標,掌握好指標的概念對學好C有很大幫助。 為了方便理解我們可以把指

C語言連結串列(超詳細)

前言:之前學習連結串列的時候總會遇到一些問題 也看了好多人的文章感覺有些不是太實用 然後後來也是自己摸索才大概寫出來的. 在真正的開發中會把連結串列的增刪改查寫到函式裡 但是刪除有點麻煩 找了很多都是刪除第幾個 而不是刪除某個值對應的節點 讓我很難受 所以想寫一些連結串列的操作分享

C語言連結裝載流程全面分析

連結的主要內容是把各個模組之間相互引用的部分處理好,使得各個模組之間能夠正確地銜接。 連結的主要過程包括:地址和空間分配(Address and Storage Allocation),符號決議(Symbol Resolution),重定位(Relocation)等。 連結分為靜態連結和動態

使用C語言連結串列實現商品管理系統

#include <stdio.h> #include <stdlib.h> #include <windows.h> #define bool char #define true 1 #define false 0 #define NUM 1

5 種排序演算法--C語言連結串列

原始碼地址 GitHub:https://github.com/GYT0313/C-DataStructure/blob/master/sortIn5.c 包括: 氣泡排序 快速排序 選擇排序 插入排序 希爾排序 執行: 注意:

c語言連結MySQL資料庫出現Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'

這個問題,困擾了我好幾天,最後終於解決了。首先,我用find命令找了半天,也只有/tmp/mysql.sock,當時我很崩潰啊,後來看到一篇文章,我忘了地址,讓我有感,於是解決了這個問題。 1、在/var/run/目錄下建立一個mysqld的資料夾(如果這個資料夾沒有的話)。 sudo

1870 Problem B C語言-連結串列排序

問題 B: C語言-連結串列排序 時間限制: 1 Sec  記憶體限制: 128 MB 提交: 86  解決: 71 [提交][狀態][討論版][命題人:外部匯入] 題目描述 已有a、b兩個連結串列,每個連結

C語言連結串列的建立插入等綜合實戰

系本人原創,轉載請註明出處: 程式設計老師讓寫一個連結串列的綜合運用,包括建立,檢視某個節點,刪除某個節點,插入某個節點,以及連結串列的逆序,還必須要有出錯提示和返回。QaQ,,,看見這麼多東西我就想嚶嚶嚶, 先放上鍊表的結構體: typedef struct stud

C語言連結串列節點插入與刪除

線性表操作 順序表是我們資料結構中的基本儲存形式,現在給定一個順序表,有如下操作: Insert X Y:在順序表中X位置插入Y元素,遍歷輸出當前順序表的所有元素。 Delete X:刪除順序表中的X元素,如果有多個X元素,只刪除第一個X,遍歷輸出當前順序的所有

C語言連結串列:遍歷,頭插,尾插,中間插入;頭節點刪除,尾節點刪除,中間刪除的操作

/****************************************************************************************************************************************

一步一步教你從零開始寫C語言連結串列---構建一個連結串列

為什麼要學習連結串列? 連結串列主要有以下幾大特性: 1、解決陣列無法儲存多種資料型別的問題。 2、解決陣列中,元素個數無法改變的限制(C99的變長陣列,C++也有變長陣列可以實現)。 3、陣列移動元素的過程中,要對元素進行大範圍的移動,很耗時間,效率也不高。

從零開始的c語言連結串列學習 001--建立一個最簡單基礎的連結串列

因為各種原因,儘管c語言期末考也拿了八十多分,卻仍然對連結串列處在完全甍逼的狀態,以至於之後的資料結構課聽天書,實驗課做不出來,於是決定重學一波連結串列的知識,特此記錄筆記 001—建立一個簡單的連結串列 1.1 認識連結串列 所謂連結串列,一言蔽之就是一連串帶

C語言連結串列多項式的加法

6-3 Add Two Polynomials (20 point(s)) Write a function to add two polynomials. Do not destroy the input. Use a linked list implementation

C語言連結串列的5種常見操作

C語言連結串列的5種常見操作 單鏈表反轉 連結串列中環的檢測 兩個有序的連結串列合併 刪除連結串列倒數第n個結點 求連結串列的中間結點 Ref typedef struct list{ int i

C語言 連結串列的建立,插入,刪除,列印

#include <stdio.h> #include <stdlib.h> #include <memory.h> //結構體定義 struct Node{ char name[10]; int score; s

C語言連結串列頭插法,尾插法,排序

題目描述 火車站要組裝一列動車。每列車廂有車廂編號、座位數和座位等級。現在請你把它們組裝起來,要求按照車廂號碼升序排列,並輸出每列車廂的資訊。請使用連結串列來實現。 輸入 輸入有多組。 每組有多行。第一行是個正整數n,表示車廂數目。接下來有n行資料,每行資料有3個值,分別是車廂編號、

C語言連結資料庫

一、解釋一下函式功能和用法 1.mysql_real_connect 函式原型:MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd,

C語言 連結串列的插入和刪除

#include <stdio.h>#include <malloc.h>#include "SeqList.h"typedef unsigned int TSeqListNode;typedef struct _tag_SeqList{    int

C語言連結串列實現佇列操作

還是操作佇列,但是這次換成連結串列,但是要注意出隊的操作。 一般的思維是在出隊的時候,刪除頭結點的下一個節點,這樣的話確實可以將佇列中的節點全部刪除,但是如果我們將最後一個節點刪除的時候,我們的演算法就將tail指標賦值為NULL,這時如果再進行入隊操作的時候,就會發生段錯