g++
でコンパイルされたCネスト構造体に関するコンパイルエラーでコミュニティのヘルプが必要です。g入れ子構造体でg ++コンパイルエラー
私は次の3つのファイルがあります。
main.cppに(完全性のため、このファイルはコンパイルエラーを再現する必要はありません): ns.h
#include <iostream>
#include "ns.h"
int main(int argc, char* argv[])
{
someFunc();
return 0;
}
:
を#ifndef NS_H
#define NS_H
#ifdef __cplusplus
extern "C" {
#endif
void someFunc();
#ifdef __cplusplus
}
#endif
#endif // NS_H
ns.c:
#include "ns.h"
#ifdef __cplusplus
extern "C" {
#endif
#define MY_MAX (42)
typedef struct _outer
{
int count;
struct Inner
{
int count;
void* cb;
void* ctx [ MY_MAX ];
} inner_[ MY_MAX ];
} Outer;
Outer g_outer[ 10 ];
#include "staticFuncs.h"
void someFunc()
{
staticFunc();
}
#ifdef __cplusplus
}
#endif
staticFuncs.h:
#include <stdio.h>
#ifdef __cplusplus
extern "C" {
#endif
static void anotherStaticFunc()
{
printf("%s", __FUNCTION__);
struct Inner* ptr = NULL;
ptr = &(g_outer[ 0 ].inner_[ 0 ]);
(void)ptr;
}
static void staticFunc()
{
printf("%s", __FUNCTION__);
anotherStaticFunc();
}
#ifdef __cplusplus
}
#endif
次のように関連したコンパイルは次のとおりです。
>g++ --version
g++ (GCC) 4.8.3 20140911 (Red Hat 4.8.3-7)
Copyright (C) 2013 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.
>g++ -g -c ns.c -o ns.o
In file included from ns.c:22:0:
staticFuncs.h: In function 'void anotherStaticFunc()':
staticFuncs.h:12:7: error: cannot convert '_outer::Inner*' to 'anotherStaticFunc()::Inner*' in assignment
ptr = &(g_outer[ 0 ].inner_[ 0 ]);
^
できますか?
C
では、ネストされた構造体はスコープ構文では参照されませんが、ネストされていないものとして参照されています。私はstaticFuncs.h
のようにstruct Inner* ptr = NULL;
をやることができると確信しています。私の自信よりも重要なことに、g++
ではなくcc
でコンパイルすると、コンパイルが実行されます。
私はどこでもextern "C"
の中で投げることによってC
、ないC++
、コードをコンパイルしていg++
を伝えるために、私のdamnedestを試してみたが、それはまだInner
のスコープにつまずくます。
誰でもこのコンパイラエラーが発生する理由とその回避方法を特定できますか?コンパイルにはg++
を使用する必要があります。
staticFuncs.h
がstaticFuncs.c
の場合、問題は変わりません。
静的関数が静的でない場合、問題は変わりません。
staticFuncs.h/c
の内容が#include
ではなくns.c
に埋め込まれている場合、問題は変わりません。
です«なぜあなたはその後も、C++コンパイラを使用しようとしていますか? 'g ++'の代わりに 'gcc'を使うだけです。 –
これは私がコンパイラで選択肢を持っていない仕事で問題を単純化したものです。 – StoneThrow
'extern" C "'は言語に何の影響も与えず、シンボルの生成方法にのみ影響します。 – molbdnilo