3

__attribute__((selectany))Linuxに代替手段があるかどうか知りたいですか?

私はそのようなものを定義したいと思います:

char * a[] = { "qwe", "zxc" };

ヘッダーファイルに追加し、一緒にリンクされる多くの .c ファイルに含めます。そのため、リンカは「a」の複数の定義を参照するため、リンクしません。私はこの属性 (selectany) を読んだことがありますが、これは "a" の最初に見られる定義のみを使用しますが、残念ながらそれは ms ウィンドウ専用です。質問は次のとおりです。Linuxに代替方法はありますか?

編集:実際の質問は次のとおりです。リンカに最初に見た定義のみを使用し、おそらくそれらが異なっていても他の定義を無視するように指示する方法はありますか? データを定義する方法がたくさんあることは知っていますが、データを定義する方法の解決策を探しているわけではありません。代わりに、複数の定義を持ち、リンカを最初に見たもので動作させる方法があるかどうかを知りたいです。 ..

4

4 に答える 4

2

まず、const属性を明確に指定する必要があります。

char const * a[] = { "qwe", "zxc" };

文字列リテラルを変更すると、未定義の動作が発生します。次に、少なくとも部分的にあなたの質問に答えます。

以前の回答のように宣言するアプローチに加えて、extern推奨されていない最初の続行方法は、配列を宣言することstaticです。次に、配列を使用する各コンパイル単位に配列のコピーを作成します。配列の内容を変更したくない (ポインターが別の文字列を指している) 限り、これは問題ありませんが、コードが少し大きくなります。

関数スコープで文字列を参照するだけで、C99 準拠のコンパイラを使用している場合は、複合リテラルの使用を検討できます。

#define MYARRAY ((char const*const[]){ "qwe", "zxc" })

これにより、期待どおりに読み取り専用MYARRAY[1]を使用できます。適切なコンパイラーは、そのようなアクセスを最適化できるはずです。

于 2011-01-28T11:11:59.517 に答える
0

ヘッダーで次のように宣言するのはどうですか:

extern char * a[] = { ... }

そして、実際の a[] を 1 つの c ファイルで定義します。

char * a[] = { ... }
于 2011-01-28T09:38:48.380 に答える
0

単純にヘッダーで宣言して、1 つの翻訳単位で 1 つの定義を提供しないのはなぜですか?

于 2011-01-28T09:34:53.750 に答える