2020年4月12日 星期日

C 語言 - __attribute__((weak))

使用的情境

    假設我們不知道外部是否會提供 foo() 這個 function,若沒有則用自己的 foo()。
    extern int func(void);
    int __attribute__((weak)) func(void)
    {
        return 0;
    }

備註 - 不會在動態函式庫 (.so) 中生效

    string.so
    void real_func()
    {
        printf("strong func\n");
    }
    weak.so
    void real_func() __attribute__((weak))
    {
        printf("weak func\n");
    }
    main.c
    extern void real_func();
    void main()
    {
        real_func();
    }
結果 :
    // 動態連結無效,只看順序
    gcc main.c -lstrong -lweak // 輸出 : strong func
    gcc main.c -lweak -lstrong // 輸出 : weak func

    // 正常 .o 檔
    gcc main.c weak.o strong.o // 輸出 : strong func
    gcc main.c strong.o weak.o // 輸出 : strong func


參考資料 :
https://www.itread01.com/content/1541531526.html

Related Posts:

  • C 語言 - enum enum - 列舉 enum direction { North, // 0 South, // 1 East, // 2 West // 3 }; 可搭配 typedef typedef enum direction Direction; enum direction { North, So… Read More
  • C 語言 - 正規表示法實作 ( regex.h )regex.h (Linux 原生, Windows 再說)     Regex.h 實作主要分 3 階段,regcom, regexec, regfree。 // 要被批配的 buffer 跟一些參數 int status, len, i; char buf[1024], data[1024]; getdata(data); // 正規表示式的會要先 compile (regcomp… Read More
  • C 語言 - function pointer 函數指標 function pointer 概念     基本上有 data 的 pointer 就會有 function 的 pointer。 正確的 ( 回傳 int 的 function ) int (*pfi)(); 錯誤的 ( 回傳 int pointer 的 function ) int *pfi(); function pointer 宣告     利用 typedef,… Read More
  • C 語言 - sprintf / snprintf sprintf (char *s, const char *format, ...)     C 語言並沒有其他語言方便的 container 去作字串轉換,所以 sprintf 就顯得強大許多。原理就是 printf 但輸入到字串。但會有 overflow 的 issue 產生。 int main() { char str[5]; sprintf(str, "ABC"); … Read More
  • C/C++ - 左值、右值 ( lvalue、rvalue )lvalue、rvalue 基本概念 左值 (lvalue) : 一個佔據某個特定記憶體的值。 右值 (rvalue) : 一個 expression 結束後就消失的值。 基本上這兩個定義包含了全部的值,非左即右,非右即左。 int var = 4; // var 參數佔據記憶體 = lvalue 4 = var; // 4 不佔據記憶體 = rvalue (var + 1) = 4; // var … Read More

0 意見:

張貼留言

Popular Posts