0

gcc には__attribute__((weak))、関数などの弱いシンボルを作成できる機能があります。これにより、ユーザーは関数を再定義できます。XC8 でも同じ動作をしたいと思います。

より詳しい情報:

XC8 用のドライバーを作成しており、低レベルの初期化をユーザー定義関数に委譲したいと考えています。

関数を再定義できることはわかっていputchます。XC8 のソース ファイルに実装され、printf 関数によって呼び出される関数があります。ユーザーはputch自分のアプリケーション内で再実装できます。同じ名前の関数が 2 つありますが、エラーは発生しません。

putchさんのXC8のソースファイルの実装は「実装が弱い。ユーザー実装が必要かもしれません」というコメントがあるので、可能に違いない。

XC8 のユーザー ガイドでプラグマを見ましたが、この質問に関連するディレクティブはありません。

4

2 に答える 2

0

XC8 コンパイラは「weak」属性をサポートしています。

weak 属性により、宣言が弱いシンボルとして発行されます。弱いシンボルは、同じシンボルのグローバル バージョンが利用可能な場合、代わりにそのバージョンを使用する必要があることを示します。外部シンボルへの参照に weak 属性が適用されている場合、そのシンボルはリンクに必要ありません。

例えば:

extern int __attribute__((weak)) s;

int foo(void) 
{
    if (&s)
        return s;
    return 0;   /* possibly some other value */
}

上記のプログラムでは、s が他のモジュールによって定義されていない場合でも、プログラムはリンクされますが、s にはアドレスが与えられません。条件は、s が定義されていることを検証します (定義されている場合はその値を返します)。それ以外の場合は「0」が返されます。この機能には多くの用途があり、主にオプションのライブラリとリンクできる汎用コードを提供するために使用されます。

変数は、"weak" 属性で修飾することもできます。

例えば:

char __attribute__((weak)) input;
char input __attribute__((weak));
于 2020-08-02T12:38:31.193 に答える