1


0

異なるgccバージョンの構文エラー?

私はUbuntu Linuxを使ってCでプログラムを書きましたが、今度はそれを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で動作させるために含める必要があるヘッダーファイルはありますか?

P.S. 使用しているUNIXのバージョンとgccのバージョンを確認するためのコマンドは何ですか。 これを知っていれば、私は私の質問においてより具体的になることができます。

ありがとう

9 Answer


3


純粋なCをコンパイルしている場合、変数は関数の先頭で宣言されなければなりません。 ほとんどの人はCコンパイラを使ってCプログラムをコンパイルするので、純粋なCコンパイラでは通常は利用できないリソースを提供します。最も一般的な例は//コメント行です。


2


コードの移植性を確認したい場合は、必ず-pedanticまたは-pedantic-errorsを使用してください。

これはあなたのコードが規格準拠から逸脱している場合に警告/エラーを提供します。

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

また、正しいGCCフロントエンド実行ファイルを使用します。g明示的に指定しない限り、*。cファイルをCファイルと同様に扱います。 ですから、本物のCをコンパイルしているのなら、gではなくgccを使ってください。

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

あなたの特定の問題を解決するために、43行目を見るのがいいかもしれません。 44行目にエラーが書かれていますが、次の行の最初の語彙素に到達するまで、先行する行に問題があり、その問題がパーサーによって検出されないために、多くの問題が発生します。


1


どうやってファイルをコピーしましたか? そこにはないはずのものを挿入した可能性はありますか?

ところで:あなたのコードでcodeタグのあなたの使用を直しなさい - 私のブラウザで「ソースを見る」を使わないで読むことは現在ほとんど不可能です。

あなたは質問を終えます:

uname -a gcc -v


1


移植可能なコードを書き込もうとするとき、次のコンパイラフラグは次のプラットフォームでコードをコンパイルしようとしている限りであなたが得る多くの問題についてあなたに教えてくれるでしょう:

-std = c89 -pedantic -Wall

他のコンパイラではなく、他のプラットフォーム上のGCCのみをターゲットにする必要がある場合は、次の方法を試してください。

-std = gnu89 -pedantic -Wall

しかし、これにより、古いGCCではサポートされていない新しいGCCでのGNU拡張機能が許可される可能性があります。 よく分かりません。

-pedanticがすべての非標準プログラムについて警告することが保証されていればいいのですが、そうではありません。 まだ見逃していることがいくつかあります。


1


あなたは私達にエラーのためのより多くの文脈を提供しなければならないでしょう…少なくとも1行、おそらく44行目と54行目の前に数行。 44行目(おそらく40行目から)から54行目(または数行後 - おそらく60行目)までの関数定義の先頭からコードを渡していただければ、どうぞお役立てください。 44行目より前の情報に何か問題があるため、44行目に「char」以外のものが予期されています。 54行目(同じ問題かもしれません)。


1


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

フリードリヒよろしく


1


スティーブ、

最初のエラーメッセージは "` parse error` * before *` 'char'` "と書いています。 precedes charというコードは何ですか? 関数宣言ですか? それには、任意のユーザー定義型またはその種のものが含まれていますか?

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


0


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

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

gcc  - バージョン


0


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

gcc  - バージョン

周囲のコードを見ることができるように、それは関数を示すのを助けるかもしれません。 多くの場合、「エラーを解析する前に」型エラーが発生します。