0

タイプがあります:

typedef struct 
{
   int x;
   int y;
   int z; 
} sdf_test_t;

しかし、次をコンパイルしようとすると:

offset = offsetof(sdf_test_t, z);

Visual Studio は次のように応答します。

c:\dataflash.c(542) : error C2143: syntax error : missing ')' before 'type'
c:\dataflash.c(542) : error C2059: syntax error : ')'

ここで何が問題なのですか?

私は使っている:

Microsoft Visual Studio 2008 x86 
Microsoft (R) Visual Studio Version 9.0.21022.8.

offsetofマクロは次のように定義されて<stddef.h>います。

/* Define offsetof macro */
#ifdef __cplusplus

#ifdef  _WIN64
#define offsetof(s,m)   (size_t)( (ptrdiff_t)&reinterpret_cast<const volatile char&>((((s *)0)->m)) )
#else
#define offsetof(s,m)   (size_t)&reinterpret_cast<const volatile char&>((((s *)0)->m))
#endif

#else

#ifdef  _WIN64
#define offsetof(s,m)   (size_t)( (ptrdiff_t)&(((s *)0)->m) )
#else
#define offsetof(s,m)   (size_t)&(((s *)0)->m)
#endif

#endif  /* __cplusplus */

消去法で。コンパイラが以下を使用することを確認しました。

#define offsetof(s,m)   (size_t)&reinterpret_cast<const volatile char&>((((s *)0)->m))
4

2 に答える 2

2

私はそれとして簡単なプログラムを作りました:

#include <stddef.h>

typedef struct 
{
  int x;
  int y;
  int z; 
} sdf_test_t;

int main() {
  size_t offset = offsetof(sdf_test_t, z);
  return 0;
}

問題はありません。コードを別のプロジェクトに分離して、もう一度テストしてみてください。

于 2015-08-05T20:58:11.540 に答える
0

ソースファイルに次の行を追加することで、なんとか修正できました。

#include <stddef.h>

このことから、ヘッダー ファイルを明示的にインクルードしない場合、Visual Studio はヘッダー ファイルを暗黙的にインクルードしているようです。さらに悪いことに、ソースファイルがC++デフォルトであると想定しています。

使用するシンボルを含むヘッダー ファイルをインクルードしない場合、コンパイラが何かを構成するだけでなく、叫び声を上げてエラーを報告することを期待します...

于 2015-08-05T21:00:37.167 に答える