私は定数の文字列が定義されている構造体と、自分の文字列オブジェクトへのポインタを持っています。目的は、charsとtxtをNULLに設定してこの構造体の変数を宣言し、実行時にcharを表すMyStringオブジェクトを作成することです。 GLibを使用している間は、コンパイル時にMyStringを作成できません。このライブラリでは、最初にg_type_initを呼び出す必要があります。mingw const char stringは確かにconstではありません
struct _MyStaticString {
volatile MyString * txt;
const char *chars;
};
宣言は、次にようになりますので、新しいのMyStringオブジェクトを作成した場合、その後のtxtがNULLである場合には、第1の検査で私のMyStringオブジェクトを提供するためのrepsonsibleある機能が彼らのです
struct _MyStaticString my_test_string = { NULL, "Hello world or foo bar, or a rick roll" };
このMyStringオブジェクトを返します。
struct _MyString *my_static_string(struct _MyStaticString *a_static) {
printf("a_static=%lx\n", (gulong) a_static);
printf("a_static.chars=%s\n", (char *) a_static->chars);
if (a_static->txt == NULL) {
CatString *result = g_object_new(MY_TYPE_STRING, NULL);
// result->data = (gchar *) a_static->chars;
result->data = strdup((char *) a_static->chars);
result->size = strlen((char *) a_static->chars);
result->hash = 0;
g_object_ref_sink(G_OBJECT(result));
result->parent.ref_count = 1000;
a_static->txt = result;
}
return (struct _MyString *) (a_static->txt);
}
このすべてが素晴らしい作品と私はLinux上でGCCを実行しているとき、少なくとも私は、とても幸せです。私がMinGWコンパイラの助けを借りてWindows上でこのコードをコンパイルし始めると、間違ったことが起こり始める。私がすべてのプロジェクトを一つのプロジェクトに入れたら、それでもまだ良いですが、宣言を.aライブラリに入れて、それを他の場所で使うとすぐに、a_static-> charsはNULLになります。だから、私は演奏/微調整/テストを始めました。オブジェクトファイル内のデータが整列し、#pragma pack(16)が追加された可能性があります。それはうまくいかなかった。おそらく私を助けることができる属性があると思いました。だから私は__attribute__
((共通))を追加しました。それはうまくいかなかった。私はスマートであると考えと構造体宣言から文字列を分離自体が好き:
const char helper_txt = "Hello world or foo bar, or a rick roll";
struct _MyStaticString my_test_string = { NULL, helper_txt };
を私はコンパイルエラーを取得:ここ
error: initializer element is not constant
error: (near initialization for 'field.chars')
は私のコンパイラフラグは
C:\MinGW\bin\gcc.exe
-IC:\MinGW\include
-IC:\GTK_ALL_IN_ONE\include\gtk-2.0
-IC:\GTK_ALL_IN_ONE\lib\gtk-2.0\include
-IC:\GTK_ALL_IN_ONE\include\atk-1.0
-IC:\GTK_ALL_IN_ONE\include\cairo
-IC:\GTK_ALL_IN_ONE\include\gdk-pixbuf-2.0
-IC:\GTK_ALL_IN_ONE\include\pango-1.0
-IC:\GTK_ALL_IN_ONE\include\glib-2.0
-IC:\GTK_ALL_IN_ONE\lib\glib-2.0\include
-IC:\GTK_ALL_IN_ONE\include
-IC:\GTK_ALL_IN_ONE\include\freetype2
-IC:\GTK_ALL_IN_ONE\include\libpng14
-IC:\work\workspace\module-blah\src
-O0 -g3 -Wall -c -fmessage-length=0 -mms-bitfields -DOSWINDOWS
、ここでされていますバージョン
C:\>c:\MinGW\bin\gcc.exe --version
gcc.exe (GCC) 4.5.0
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
コンパイラのフラグが足りないか、const char *の文字列を.a libにエクスポートするための属性を追加する必要がありますか?その文字列が.a libの天気をチェックする簡単な方法ですか?それとも、リンカのオプションがありますか?
あなたは予約済みの識別子を使用している:大文字が続くアンダースコアで始まり、Cのいずれかの識別子は、(標準の7.1.3を参照)を実装用に予約されており、したがって、このプログラムは、未定義の振る舞いを呼び出しています。私のルールでは、識別子をアンダースコアで始めることは決してありません。 –
また、「a_static-> charsフィールドがNULLになる」とはどういう意味ですか?特に何が起こったのですか?それは 'const char helper_txt'か正しい' const char * helper_txt'ですか? –