gcc和vc的兩點區別

作者:朱金燦

來源:https://blog.csdn.net/clever101

 

      gcc和vc的第一點區別是:

int x[n];// 在vc中,n必須是常數,這個內存是在棧上的。當n不是常數時會出現編譯錯誤

 

int x[n];// 在gcc中,n可以是常量,當n是常量是效果相當於vc下的int x[n];n也可以是變量,當n是變量是相當於int* x= new int[n];這個內存在堆上,申請和回收編譯器負責。

 

       gcc和vc的第二點區別是:

       vc鏈接一個動態庫需要.h文件、lib文件(導入庫文件)和dll文件(動態庫文件)。gcc鏈接一個動態庫需要.h文件和so文件。爲啥gcc不需要lib文件(導入庫文件)呢?這是因爲vc的動態庫接口函數是默認都不導出的,只有設置導出符號才能導出,就是那個 __declspec(dllexport),而所有的導出函數名都放在lib文件(導入庫文件)。而Linux下的動態庫是默認所有函數都是導出的,所以so文件意味着lib和dll一體。就是說lib文件決定是調用方只能調用哪些接口,而so文件裏面的符號表,把自己裏面有什麼東西是一覽無餘的。說得形象些就是vc是你給他一個文檔(lib文件),說我這裏有這些可以提供給你用,別的免談,我文檔裏沒寫,你想搶那是不行的。而gcc是我直接進你家看你都有啥,我想拿啥就拿啥。

 

       現在覺得gcc的這個設計有點腦殘,因爲這很容易導致一個問題,就是串庫。串庫就是兩個so裏都有同一個函數,那他運行時調用的哪個,就不確定了。這是一個很奇葩也很危險的情況,在實際中也很難調試和排查。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章