3

グローバルスコープで構造を初期化する方法がわかりました。

以下はサンプルコードです。

#include<GL/glut.h>
struct A
{
    int x;
};
struct A a;
a.x=6;
int main()
{}

そして、私はUbuntu 11.10を使用しています。このプログラムをコンパイルすると、次のエラーが発生します。

error: ‘a’ does not name a type

なぜこれが起こるのか分かりません。複雑なパラメータをコールバック関数に渡す方法を知りたいですか?

どうもありがとう

4

3 に答える 3

2

そして私はUbuntu11.10を使用していますが、このプログラムをコンパイルすると、次のエラーが発生します。エラー:「a」はタイプに名前を付けていません

コンパイラーは、このメッセージで、構造体メンバーへの割り当てはグローバルスコープでは発生しないことを通知します。aどちらかの書き込みを初期化する場合

struct A a = {6};

または新しい構文を使用する

struct A a = {.x = 6};

または、プログラム開始後の早い段階(つまり、メインの開始時)に初期化割り当てを実行します。

更新/編集:

ところで:これはGLUTやその他のヘッダーとは何の関係もありません。これは言語仕様のものです。

更新/編集2

複雑なパラメータをコールバック関数に渡す方法を知りたいですか?

GLUTはユーザー定義のコールバックデータを指定できないため、GLUTコールバックの場合は困難になります。ffcallライブラリを使用して、その場でクロージャを作成し、それをGLUTに渡すことができます。ただし、次の点を考慮する必要があります。この壁にぶつかったらすぐに、GLUTを捨てる時が来ました。GLUTはOpenGL開発の要件ではなく、複雑なアプリケーションのベースとして意図されたものではありません。したがって、その場合は使用しないでください。

于 2012-05-10T08:28:19.150 に答える
0

関数の外で割り当てを行っています。あなたの場合、コードを 1 行だけ移動して、次のようにすることができます。

#include<GL/glut.h>
struct A
{
    int x;
};
struct A a;
int main()
{
    a.x=6;
}
于 2012-05-10T08:28:50.490 に答える
0

あなたが観察している問題は、過剰摂取とは関係ありません。コンパイラでは、グローバル スコープ内の構造体に値を割り当てることはできません。構造体のコンストラクター (グローバル スコープで許可されます) を呼び出すか、関数で代入を呼び出すことによって、目的を達成できます。

編集:ここに多少関連する議論があります:グローバルスコープで配列添字にアクセスできないのはなぜですか

于 2012-05-10T08:38:36.370 に答える