c語言中const對于define優點,為什么大多數C開發人員使用define而不是const?

這有一個非常可靠的原因:C中的const并不意味著一些常量。 這只是意味著一個variables是只讀的。

在編譯器需要一個常量的地方(例如非VLA數組的數組大小),使用constvariables(如fieldWidth是不可能的。

他們不一樣

const只是一個限定符,它表示一個variables在運行時不能被改變。 但variables的所有其他function仍然存在:已經分配了存儲空間,并且可以解決此存儲空間問題。 因此,代碼不僅僅把它當作一個文字來對待,而是通過訪問指定的內存位置來引用variables(除非它是static const ,那么它可以被優化掉),并且在運行時加載它的值。 而作為一個constvariables已經分配了存儲空間,如果你把它添加到一個頭文件中,并將它包含在幾個C源代碼中,除非將其標記為extern否則將會出現“多符號定義”鏈接錯誤。 在這種情況下,編譯器無法根據實際值優化代碼(除非進行全局優化)。

#define只是用它的值replace一個名字。 此外,可以在預處理器中使用#ifdef常量:可以使用#ifdef根據其值進行條件編譯,也可以使用string化運算符#來獲取string的值。 而且由于編譯器在編譯時知道它的值,所以可以根據這個值優化代碼。

例如:

#define SCALE 1 ... scaled_x = x * SCALE;

當SCALE被定義為1 ,編譯器可以消除乘法,因為它知道x * 1 == x ,但是如果SCALE是( extern ) const ,則需要生成代碼來獲取值并執行乘法,因為值直到連接階段才會知道。 ( extern需要使用來自多個源文件的常量。)

更接近于使用#define使用枚舉:

enum dummy_enum { constant_value = 10010 };

但是這只限于整數值,并沒有#define優點,所以沒有被廣泛的使用。

當你需要從編譯它的某個庫中導入一個常量值的時候, const是很有用的,或者如果它和指針一起使用的話。 或者,如果它是通過variables索引值訪問的常量值數組。 否則, const比#define沒有任何優勢。

原因是大多數時候,你想要一個常量,而不是一個const限定的variables。 在C語言中,這兩者并不是相同的。 例如,variables作為static持續時間對象的初始值設定項的一部分無效,例如非vla數組維度(例如結構中的數組大小或任何數組前C99)。

在R的答案稍微擴展一下: fieldWidth不是一個常量expression式 ; 這是一個const限定variables。 它的值直到運行時才build立,所以在需要編譯時常量expression式的地方(比如在一個數組聲明中,或者在一個switch語句中的一個case標簽等),它不能被使用。

與預處理后擴展為常量expression式10的macrosFIELD_WIDTH比較; 這個值在編譯時是已知的,所以它可以用于數組維度,案例標簽等。

要添加到R.和Bart的答案:在C:枚舉types常量中只有一種方法來定義符號編譯時間常量。 這個標準規定這些是inttypes的。 我個人會寫你的例子

enum { fieldWidth = 10 };

但是我覺得C程序員的口味差別很大。

雖然const int并不總是合適的,但是如果你定義了一個整型值,枚舉通常會作為#define的替代。 這實際上是我在這種情況下的首選。

enum { FIELD_WIDTH = 16384 }; char buf[FIELD_WIDTH];

在C ++中,這是一個巨大的優勢,因為您可以將枚舉的范圍限定在類或名稱空間中,而不能將范圍定義為#define。

在C中,你沒有命名空間,也不能在一個結構體內枚舉枚舉的范圍,甚至不能確定你的types是否安全,所以我實際上看不到任何主要的優點,盡pipe也許有些C程序員會指出。

根據K&R(第2版,第211頁),“const和volatile屬性是ANSI標準新增的”。 這可能意味著真正舊的ANSI代碼根本就沒有這些關鍵字,這實際上只是一個傳統問題。 此外,它表示,編譯器應該檢測到更改constvariables的嘗試,但除此之外可能會忽略這些限定符。 我認為這意味著一些編譯器可能不會優化包含constvariables的代碼,以便在機器代碼中表示為中間值(就像#define一樣),這可能會花費額外的時間訪問遠端內存并影響性能。

一些C編譯器會將所有constvariables存儲在二進制文件中,如果準備大量的系數可以在embedded式世界中占用大量的空間。

相反:使用const允許在現有的程序上閃爍來改變特定的參數。

在C中定義數字常量的最好方法是使用枚舉 。 閱讀K&R的The C Programming Language,第39頁的相應章節。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/531610.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/531610.shtml
英文地址,請注明出處:http://en.pswp.cn/news/531610.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c語言程序設計期末試卷A,《C語言程序設計》期末試卷(A)..doc

《C語言程序設計》期末試卷(A).2011-12-1學期《C語言程序設計》期末試卷(A)班級____________姓名____________學號________________大題號一二三四總分得 分判卷 /核分人“一、選擇題”使用答題卡選擇。“二、看程序寫運行結果”答題處:題號答 案二、1二、2二、3“三…

codeforces B. Strongly Connected City(dfs水過)

題意:有橫向和縱向的街道,每個街道只有一個方向,垂直的街道相交會產生一個節點,這樣每個節點都有兩個方向, 問是否每一個節點都可以由其他的節點到達.... 思路:規律沒有想到,直接爆搜&#xff0…

c語言數組兩個值交換,如可交換兩個數組中的元素?

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓#include #include #include int main(void){int a[]{1,2,3,4,5,6,7,8};int b[]{9,10,11,12,13,15};int lena,lenb,randa,randb,randtimes;int i,temp;srand((unsigned)time(NULL));lena sizeof(a)/sizeof(int);lenb sizeof(b)/s…

Uvaoj 11248 Frequency Hopping(Dinic求最小割)

題意:1到n節點(節點之間有一定的容量),需要流過C的流量,問是否可以?如果可以輸出possible, 否則如果可以擴大任意一條邊的容量 可以達到目的,那么輸出possible option:接…

隨機數歸并排序c語言,用C語言實現歸并排序

#include#include#include#include#define random(i) (rand()%i)#define N 12#define INFINITY 99999999//要排序的數存放在a數組匯總,p,q,r是數組下標void Merge(int *a,int p,int q,int r){int n1q-p1;int n2r-q;int *L(int *)malloc(sizeof(int)*n1);int *R(int …

UVAoj 11324 - The Largest Clique(tarjan + dp)

題意&#xff1a;給定一個有向圖&#xff0c;尋找一個點數最大集合&#xff0c;使得這個集合中的任意兩個點 u,v, 都有u->v 或者 v->u 或者u<>v 思路&#xff1a;首先將強連通分量通過tarjan算法求出來&#xff0c;然后進行縮點&#xff0c;也就是每一個縮點 所組成…

android開發藍牙自動連接電腦上,Android藍牙開發之自動連接設備

自動連接使用的是SharedPreferences這個來解決。private void Automaticconnection() {SharedPreferences sp getSharedPreferences("Dizhi", MODE_PRIVATE);String address sp.getString("address", "");if (!address.equals("")) …

hdu 2014鞍山賽區 5073 Galaxy

題意&#xff1a;就是給你 n 個數&#xff0c;代表n個星球的位置&#xff0c;每一個星球的重量都為 1 &#xff01; 開始的時候每一個星球都繞著質心轉動&#xff0c;那么質心的位置就是所有的星球的位置之和 / 星球的個數 現在讓你移動 k 個星球到任意位置&#xff08;多個星球…

android onitemclicklistener 參數,android – 對listview中的項使用setOnItemClickListener

大家好,有一個應用程序,可以在SD卡上保存音頻.我創建了一個listview,它從sdcard中檢索文件名.我正在嘗試設置一個監聽器,所以當單擊文件名時,我可以啟動另一個播放該文件的意圖.當我嘗試設置監聽器并傳入一個新的OnItemClickListener()時,eclipse是紅色的下劃線.我知道我必須實…

DRF之請求與響應

目錄 一、模塊與包回顧 二、反序列化校驗源碼分析(了解) 三、斷言 四、drf之請求 【1】源碼分析 【2】配置視圖類能處理的編碼格式 五、drf之響應 【1】源碼 【2】響應編碼格式 一、模塊與包回顧 模塊與包 什么是模塊&#xff1f; 一個py文件&#xff0c;被別的py文件…

android 常用注解,Android 開發小工具之:注解 Annotation

Android Support 包之一的 support-annotations是通過靜態編譯檢測來提高代碼質量的一個注解工具。里面包含了 Android 開發中常用的代碼檢測注解&#xff0c;幫助開發者提高代碼質量。通過 SDK Manager下載 Android Support Repository 后&#xff0c;在 Gradle 中通過如下聲明…

codeforces B. Friends and Presents(二分+容斥)

題意&#xff1a;從1....v這些數中找到c1個數不能被x整除&#xff0c;c2個數不能被y整除&#xff01; 并且這c1個數和這c2個數沒有相同的&#xff01;給定c1, c2, x, y&#xff0c; 求最小的v的值&#xff01; 思路&#xff1a; 二分容斥&#xff0c;二分找到v的值&#xff0c;…

android音量鍵廣播,音量控制鍵控制的音頻流(setVolumeControlStream)描述

音量控制鍵控制的音頻流(setVolumeControlStream)描述2021-01-03 16:18Android教程網 Android當開發多媒體應用或者游戲應用的時候&#xff0c;需要使用音量控制鍵來設置程序的音量大小,在Android系統中有多種音頻流,感興趣的朋友可以了解下當開發多媒體應用或者游戲應用的時候…

eclipse的使用

eclipse如何打開一個已存在的工程&#xff01;先給eclipse創建一個workspace,這個workspace就是一個文件夾用來管理eclipse項目的&#xff0c;或者修改eclipse的workspace,選擇菜單file->switch workspace->other,選擇一個已經存在的workspace。將已經存在的項目導入到wo…

Android延伸布局到狀態欄,Android 狀態欄透明

前言&#xff1a;最近項目大量用到狀態欄透明&#xff0c;網上也出現很多庫可以直接拿來用&#xff0c;個人認為沒有必要那么重引用到一個庫(有木有同學和我有一樣的想法)&#xff0c;所以研究了一番&#xff0c;在此做個記錄加強記憶也便后期查閱&#xff0c;如果無意中有幸能…

glassfish服務器默認的網頁所在的位置

http://localhost:8080/ 默認打開的網頁所在的位置 E:/glassfish-4.1/glassfish/domains/domain1/docroot/index.html 轉載于:https://www.cnblogs.com/hujunzheng/p/4052920.html

華為HarmonyOS 鴻蒙,華為鴻蒙HarmonyOS2.0手機開發者Beta版正式發布

據悉&#xff0c;本次手機開發者Beta測試支持以下中國境內主制式手機及平板電腦。手機&#xff1a;全網通(5G雙卡)P40 、 全網通版P40 Pro、Mate30、Mate30(5G) 、Mate30 Pro、Mate30 Pro(5G)&#xff0c;型號清單為ANA-AN00、ELS-AN00、TAS-AL00、TAS-AN00、LIO-AL00、LIO-AN0…

http協議客戶端向服務器端請求時一般需要發送的內容

out.println("GET /shopping/index.html HTTP/1.1");//請求行 包括請求方式&#xff0c;文件路徑&#xff0c; http協議版本&#xff08;必寫&#xff09;請求頭.... out.println("Aceept: */*");//客戶端能夠處理的文件類型&#xff08;不是必須&#xff…

android oneshot自動播放bug,移動端常見bug匯總001

前言本文是摘錄整理了移動端常見的一些bug以及解決方案&#xff0c;第一篇&#xff0c;后面還會有持續的文章更新整理。點擊樣式閃動Q: 當你點擊一個鏈接或者通過Javascript定義的可點擊元素的時候&#xff0c;它就會出現一個半透明的灰色背景。A:根本原因是-webkit-tap-highli…

int.class 與 Integer.class

TYPE 表示的引用類型所對應的基本類型的Class對象&#xff01; 轉載于:https://www.cnblogs.com/hujunzheng/p/4055471.html