<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                [TOC] 所謂引用(Reference),是指對符號的使用。在下面的代碼中: ~~~ int a = 100, b = 200, c;c = a + b; ~~~ 第一行是符號定義,第二行是符號引用。 目前我們所看到的符號引用,在所有目標文件被鏈接成可執行文件時,它們的地址都要被找到,如果沒有符號定義,鏈接器就會報符號未定義錯誤,這種被稱為強引用(Strong Reference)。 與之相對應的還有一種弱引用(Weak Reference),如果符號有定義,就使用它對應的地址,如果沒有定義,也不報錯。 鏈接器處理強引用和弱引用的過程幾乎是一樣的,只是對于未定義的弱引用,鏈接器不認為它是一個錯誤,一般默認其為 0(地址為 0),或者是一個特殊的值,以便程序代碼能夠識別。 在變量聲明或函數聲明的前面加上`__attribute__((weak))`就會使符號變為弱引用。比如下面這段代碼: ~~~ #include <stdio.h> __attribute__((weak)) extern int a; __attribute__((weak)) extern void func(); //也可以不寫extern int main(){ printf("&a: %d, func: %d\n", &a, func); printf("a = %d\n", a); func(); return 0; } ~~~ 我們可以將它編譯成一個可執行文件,GCC 并不會報鏈接錯誤。但是當程序運行時,輸出`&a: 0, func: 0`后就會發生段錯誤(Segment Fault),這是因為符號 a 和 func 的地址都為 0,這個地址是禁止訪問的。 一個改進的例子是: ~~~ #include <stdio.h> __attribute__((weak)) extern int a; __attribute__((weak)) extern void func(); int main(){ printf("&a: %d, func: %d\n", &a, func); if(&a){ printf("a = %d\n", a); }else{ printf("a is undefined!\n"); } if(func){ func(); }else{ printf("func() is undefined!\n"); } return 0; } ~~~ 運行結果: ~~~ &a: 0, func: 0 a is undefined! func() is undefined! ~~~ 代碼中需要判斷的是地址,不是值,所以變量 a 前面需要加`&`;而函數名本身就表示地址,所以 func 前邊不需要`&`。 弱引用和強引用非常利于程序的模塊化開發,我們可以將程序的擴展模塊定義為弱引用,當我們將擴展模塊和程序鏈接在一起時,程序就可以正常使用;如果我們去掉了某些模塊,那么程序也可以正常鏈接,只是缺少了某些功能,這使得程序的功能更加容易裁剪和組合
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看