1

私は Ubuntu Linux を使用して C でプログラムを作成しましたが、それを UNIX マシン (または UNIX ボックスと思われるもの) に移植する必要があります。Ubuntu では GCC を使用して正常にコンパイルされますが、UNIX ボックスで GCC を使用してコンパイルしようとすると、次のエラーが発生します。

a.c: In function `goUpDir':
a.c:44: parse error before `char'
a.c:45: `newDir' undeclared (first use in this function)
a.c:45: (Each undeclared identifier is reported only once
a.c:45: for each function it appears in.)
a.c: In function `goIntoDir':
a.c:54: parse error before `char'
a.c:57: `newDir' undeclared (first use in this function)
a.c:57: `oldDir' undeclared (first use in this function)

主な問題は、以前の解析エラーのようですchar(他は関連しています)

44  char newDir[50] = ""; 
54  char* oldDir = (char*)get_current_dir_name();

これらは単純な C スタイルの文字列宣言です。UNIX で動作させるためにインクルードする必要があるヘッダー ファイルはありますか?

PS 使用している unix のバージョンと gcc のバージョンを確認するコマンドは何ですか? これを知っていると、質問をより具体的にすることができます。

ありがとう

4

9 に答える 9

3

純粋なCをコンパイルする場合は、関数の最初に変数を宣言する必要があります。ほとんどの人がC++コンパイラを使用してCプログラムをコンパイルするため、これについて言及します。これにより、通常は純粋なCコンパイラでは利用できないリソースが提供されます。最も一般的な例は//コメント行です。

于 2008-09-30T20:31:39.813 に答える
2

コードが移植可能であることを確認したい場合は、常に-pedanticまたは-pedantic-errorsを使用してください。

これにより、コードが標準への準拠から逸脱した場合に警告/エラーが発生します。

私たちが主題に取り組んでいる間。おそらく、すべての警告もオンにする必要があります。コンパイラが警告するのには十分な理由があります。あるプラットフォームから別のプラットフォームにコードを移動する場合、新しいハードウェア/ OS /コンパイラが現在のものと同じように動作しない可能性があるため、これらの警告は潜在的なバグの原因になります。

また、正しいGCCフロントエンド実行可能ファイルを使用します。g++は、明示的に指定しない限り、*。cファイルをC++ファイルのように扱います。したがって、実際のCをコンパイルする場合は、g++ではなくgccを使用してください。

gcc -pedantic -Wall -Werror * .c
g ++ -pedantic -Wall -Werror * .cpp

特定の問題を解決するために、43行目を参照するとよいでしょう。エラーは44行目を示していますが、多くの問題は、最初の語彙素に到達するまで問題が発生し、パーサーによって問題が検出されないことによって引き起こされます。次の行に。

于 2008-09-30T20:38:17.910 に答える
1

ファイルをどのようにコピーしましたか?あるべきではないものを挿入した可能性はありますか?

ところで:コードでのコードタグの使用を修正してください。現在、ブラウザで「ソースの表示」を使用せずに読み取ることはほぼ不可能です。

あなたは質問を終了します:

uname -a
gcc -v
于 2008-09-30T20:34:22.413 に答える
1

スティーブ、

最初のエラー メッセージは " " です。charののコードは何ですか? 関数宣言ですか?ユーザー定義型またはそのようなものが含まれていますか?parse error before 'char'

このエラーの原因として最も可能性が高いのは、44 行目の少しで、ヘッダー ファイルで宣言されている型またはマクロが使用されていることです。そのヘッダー ファイルは、使用している Ubuntu システムとコンパイルしようとしているシステムとで異なる場合があります。

于 2008-10-01T20:11:05.830 に答える
1

エラーのコンテキストをさらに提供する必要があります...少なくとも1行、おそらく44行目と54行目の前の数行。推測では、関数定義の最初から44行目までのコードを教えてください(おそらく行 40 かそこら) から行 54 (または数行後 - おそらく行 60 - その後、私たちは助けることができるかもしれません. 何かが 'char' で44 行目; 54 行目も同様 (おそらく同じ問題) です。

于 2008-10-01T02:28:32.500 に答える
1

移植可能なコードを作成しようとする場合、次のコンパイラ フラグは、次のプラットフォームでコードをコンパイルしようとする前に、多くの問題について通知します。

-std=c89 -pedantic -Wall

他のプラットフォームで GCC のみをターゲットにする必要があり、他のコンパイラをターゲットにする必要がない場合は、次を試すことができます。

-std=gnu89 -pedantic -Wall

しかし、これにより、古いGCCではサポートされていないGNU拡張が新しいGCCで許可される可能性があると思います。わからない。

-pedantic がすべての非標準プログラムについて警告することが保証されていればよいのですが、そうではないことに注意してください。まだまだ足りないものがあります。

于 2008-09-30T21:41:17.027 に答える
1

情報が不十分です。上記のコードは少なくとも興味深いものであり、ANSI C89 について話しているのか ANSI C99 について話しているのかを知る必要があります。最初の答えは広い意味で間違っています。

よろしく フリードリヒ

于 2008-10-01T05:38:03.777 に答える
0

UNIXとは何ですか?AIX、Ultrix、Minix、Xenix?

GCCには「--version」フラグがあります。

gcc --version
于 2008-09-30T20:33:27.500 に答える
0

GCCバージョンを表示するには:

gcc --version

周囲のコードを確認できるように、関数を表示すると役立つ場合があります。これは、「前にエラーを解析する」タイプのエラーの問題であることがよくあります。

于 2008-09-30T20:33:32.883 に答える