1

プロジェクトに新しいファイルを追加しました。

#ifndef PLAYER_H
#define PLAYER_H
#include "enet/enet.h" //the problem
typedef struct Player
{
    ENetPeer * peer; //requires problematic include
    //void * peer; //works, since no include required
} Player;
const struct Player playerEmpty;
#endif //PLAYER_H

が存在する場合、関連includeのないファイルが大量に取得error: expected ';', ',' or ')' before numeric constantされます。を取り外して代わりにinclude使用すれば、すべて問題ありません。void * peerenet ライブラリは別のソース ファイルに含まれており、正常に動作します。私は enet 1.3.13 (最新) を使用しており、そのヘッダー ガードが配置されているようです。これは gcc 4.9.2 の下にあります。

記録のために、エラーは次の場所で発生していPoint.hます:

#ifndef POINT_H
#define POINT_H

#include <stdint.h>

#define X 0
#define Y 1
#define Z 2

typedef  int16_t  int16_Point2[2];
typedef  int32_t  int32_Point2[2];
typedef uint16_t uint16_Point2[2];
typedef uint32_t uint32_Point2[2];

typedef  int16_t  int16_Point3[3];
typedef  int32_t  int32_Point3[3];
typedef uint16_t uint16_Point3[3];
typedef uint32_t uint32_Point3[3];

#endif //POINT_H

私はそれが何か単純だと確信しています - 私が間違っていることは何か分かりますか?

4

2 に答える 2

2

一般的には、1 文字のマクロ名を使用することをお勧めします。予期しない場所の文字を非常に簡単に置き換える可能性があります (注: マクロは、実際のコンパイル フェーズの前の実際のテキスト置換です)。

Point.hでエラーが発生していると書いています。それらが実際に発生するとは思いませんが、ここでのみ報告されています。C は、実際の文法エラーを検出するのが苦手なことで有名です。Point.h を含むファイルを確認します

注:const struct Player playerEmpty;すべてのコンパイル単位で外部リンケージを持つオブジェクトが作成されるため、ヘッダー内も望ましくない可能性があります。これは C++ とは異なります。C では、実際には定数はなく、定数変数のみがありますconst。これは、初期化されると変数が決して変更されないというプログラマーの約束にすぎません。さらに悪いことに、値を割り当てないため、効果的に作成され0ます-グローバル変数はすべてのビット0に初期化されます.これは意図したものではないと確信しています.

アップデート:

それがポイントの場合はどうですか:

typedef union __attribute__ ((__packed__)) {
    struct {
        int16_t x,y,z;
    };    // anonymous union field (C99)
    int16_t vec[3];
} int16_Point3;

...

// usage:
int16_Point3 point = (int16_Point3){ .x = 5, .y = 3 }; // compound literal
point.z = point.x + point.vec[1]; // other word for point.y

sを取り除き、#define適切な構文を取得します。

__attribute__ ((__packed__))構造体フィールド間のバイトのパディングを避けるために、gcc 固有であることに注意してください。これは非標準ですが、他のコンパイラにも同様の機能があることがよくあります (例: pragma)。構造体と配列のレイアウトを同一にする必要があります。

インデックスよりも読みやすいかもしれません。匿名の構造体および共用体フィールドは標準であることに注意してください。

于 2015-06-27T15:43:03.333 に答える
1

問題は 1 文字#defineの s でした。これは絶対にしないでください。

XYを数か月間使用してZいましたが、今日、 を含めるまで問題はPlayer.hありませんでした。これにより、最終的には、回りくどい方法で、プリプロセッサ/コンパイラでいくつかの問題が発生したに違いありません。これらを削除すると、コンパイルが (似たような) 正常に戻りました。

コメントで助けてくれた人々に感謝します。

于 2015-06-27T15:30:43.070 に答える