日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

引言

雖然用C語言這么多年,但強符號,弱符號這類東西沒有多大關注,最近關注到,感覺挺實用的。

什么是強符號,弱符號

大家都知道,我們的程序里,不論是變量名,還是函數名,都是符號,它存在于編譯鏈接整個過程,甚至在最終的可執行文件中也有(一般用于程序調試),是各目標文件之間的"粘合劑",符號貫穿了我們的程序從無到有的整個過程。

我們在編譯代碼的過程中,經常會碰到類似這樣錯誤:

C語言的強符號,弱符號以及它們的用途

 

其實這就是因為鏈接目標文件的過程中,鏈接器遇到了兩個強符號,而同時存在兩個相同的強符號,會導致鏈接器不知道應該選哪一個,所以就直接報錯。

那么怎么樣的才算強符號,怎么樣的才算弱符號呢?

正式開始前,先來了解一下GCC的attribute特性里支持weak屬性,這個和符號的強弱有直接關系,關于該屬性,GNU的官方定義如下:

The weak attribute causes a declaration of an external symbol to be emitted as a weak symbol rather than a global. This is primarily useful in defining library functions that can be overridden in user code, though it can also be used with non-function declarations. The overriding symbol must have the same type as the weak symbol. In addition, if it designates a variable it must also have the same size and alignment as the weak symbol. Weak symbols are supported for ELF targets, and also for a.out targets when using the GNU assembler and linker.

大概的意思就是,weak屬性可以將一個符號聲明為弱符號,可以用于函數庫中,方便用戶定義自己的符號以覆蓋庫中的符號。

先來看看全局變量的強符號與弱符號,看下下面幾個測試用例。按如下方式,生成文件test.c:

#include <stdio.h>

int tc_0;
int tc_0 = 6;
int __attribute__((weak)) tc_0;
int __attribute__((weak)) tc_0=1;

int main(void)
{
    printf("tc_0:%drn",tc_0);
    return 0;
}

編譯產生如下錯誤:

C語言的強符號,弱符號以及它們的用途

 

看來,即便變量定義的時候,賦了weak屬性,但是變量初始化了,也會被認為是強符號,嘗試將"int __attribute__((weak)) tc_0=1;"這一行定義注釋掉:

#include <stdio.h>

int tc_0;
int tc_0 = 6;
int __attribute__((weak)) tc_0;
//int __attribute__((weak)) tc_0=1;

int main(void)
{
    printf("tc_0:%drn",tc_0);
    return 0;
}

編譯通過了,執行結果如下:

C語言的強符號,弱符號以及它們的用途

 

這里可以得出,沒有初始化的全局變量為弱符號,而初始化過的全局變量為強符號。但是對于賦了weak屬性又初始化過的變量,雖然在同一個文件里和初始化過的全局變量同樣表現為強符號,但是如果定義在不同的文件里會是什么情況呢?這一點需要確認清楚。因此,再建立文件test2.c:

#include <stdio.h>

int __attribute__((weak)) tc_0 = 1;

此時和前面的現象不同,同樣可以編譯通過。執行結果和上一次一樣,符合預期,因為test2.c的變量被添加了weak屬性:

C語言的強符號,弱符號以及它們的用途

 

將兩個文件里的全局變量強弱屬性交換一下,再次驗證:

test.c:

#include <stdio.h>

int tc_0;
int __attribute__((weak)) tc_0 = 6;
int __attribute__((weak)) tc_0;

int main(void)
{
    printf("tc_0:%drn",tc_0);
    return 0;
}

test2.c

#include <stdio.h>

int tc_0 = 1;

編譯執行結果如下:

C語言的強符號,弱符號以及它們的用途

 

可以確定,在不同的文件中,符號的強弱關系和weak屬性強相關,不存在模糊地帶,一般的應用或者容易出問題的地方也都是在不同的文件之間。

了解完全局變量,再來了解一下函數。如果直接兩個文件有完全一樣的函數,肯定會報定義沖突,就不再討論,主要來看看將其中一個函數添加weak屬性的情況

test.c:

#include <stdio.h>

void __attribute__((weak)) tc_0(void)
{
    printf("tc_o in test.crn");
    return;
}

int main(void)
{
    tc_0();
    return 0;
}

test2.c

#include <stdio.h>

void tc_0(void)
{
    printf("tc_o in test2.crn");
    return;
}

編譯執行后,結果如下:

C語言的強符號,弱符號以及它們的用途

 

可見,可以編譯通過,且main函數里實際調用的是test2.c里的函數。

強符號,弱符號有何用處

那么這個有什么用呢?其實在GNU的定義里已經提到了,強弱符號最大的用處在于,設計框架代碼或函數庫的時候,可以將默認接口或變量定義弱符號,用戶可在自己的代碼里定義自己的接口或變量,這樣編譯鏈接的時候鏈接器會鏈接用戶自己定義的接口或變量。這樣可以增加框架或函數庫的彈性,更方便滿足用戶自定義的需求。

分享到:
標簽:符號 語言
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定