
C言語でWeb系のプログラムを作成している者です。
以前まで、OSはFreeBSD 4.11-RELEASE-p12・gccのバージョンは2.95.4でコンパイルできていたプログラムが、OSはFreeBSD 5.4-RELEASE-p8・gccのバージョンは・gccのバージョンは 3.4.2で、今まで出なかったようなエラーが沢山出現し、コンパイルできなくなってしまいました。
OSをインストールし直すのは、既に稼働中のサイトですので厳しく、GCCのバージョンを下げるかソースを書き換えるかして対処する方向で行きたいと考えております。
しかし、gccの2.95.4の圧縮ファイルはもう、gccの公式サイトに落ちておらず、バージョンダウンは難しそうです。
gccのバージョンによるコンパイルエラーを乗り越えた方、ご指摘など有りましたらお教えくださると幸いです。
No.3ベストアンサー
- 回答日時:
> ソースコードの添付は、会社のものですのでちょっと厳しいので、部分的に…
全文は必要ないのです。エラーが発生した部分を、エラーが再現可能な形で提示してもらえれば、おそらく問題点を指摘できます。
> int a = 0;
> char b[2] = "";
> char *c[256] = {0};
> こういった、宣言の指定部分で特にエラーが出ているようですので、こちらの表記が問題なのでしょうか。
上記の表記自体は問題ありません。ただ、同じ変数に対する初期化が複数回行われていると、
error: redefinition of parameter '○○'
error: previous definition of '○○' was here
ということになります。
具体的には、
int a = 1;
/* 別の宣言並び */
int a = 1;
のように、同じ変数を二回初期化した場合です。
jactaさん、ご回答有難うございます。
エラーの行が多すぎて、エラー箇所を特定できないのが現状です。
もしかしますと、初期化を二回行ってしまっているかも知れません・・・。
特に、他の関数で使われている、同名の変数でエラーが発生しているみたいですので、この辺をチェックし、もう一度ソースを見直してみることに致します。
No.5
- 回答日時:
GCCで、2.95.4から3.4.2までのバグフィックスに目を通せば
大概のことは書いていますよ。
私も同様の状況になり、上記の方法で解決しました。
お手軽な方法だと、確かコンパイル時にオプションで
指定バージョンに落とせたと思いましたが、どうでしょう。。。
f_attckさん、ご回答有難うございました。
バグフィクスですね。どうも英語が得意でなくて、避けておりましたが・・・それじゃ駄目ですよね。
これからは、ソフトの仕様も把握してから致します。
バージョンダウン、そんなに簡単にできるのですか!
お教えくださって有難うございます。
もう一度、gccのサイトを調査してみます。
No.4
- 回答日時:
C99規格やC++では宣言の位置に関する規定が無くなって(?)いますが、
見易さを考慮すると宣言は一箇所にまとめたほうがいいと思います。
また、ひとつの関数はひとつの仕事だけをするようにすれば、宣言の重複もおきにくくなると思います。
Trick--o--さん、再度ご教授を有難うございます。
同じような関数が何個も存在しているため、細かなミスが随所にあるのかも知れません。
人の作ったプログラムでしたので、あまり弄ることができず・・・。
この辺も、慣れてゆくしかないですよね。
No.2
- 回答日時:
バージョンが2.xから3.xに変わったときに出るコンパイルエラーの多くは、処理系の癖に依存するコーディングをしていたことが原因です。
具体的なエラーメッセージとソースコードがわからないと正確なことは何もわかりません。他に、コンパイルエラーは出なくても、部分式の評価順序が変わっていたりするので、規格上、「不定」にあたる動作した実装をしていると、実行時に振る舞いが変わったりします。
バージョンダウンはできると思いますが、将来にわたって不安を残すことになるので、この機に修正することをお勧めします。なお、gccの最新バージョンは4.0.2です。3.xと4.xではまた異なるので、「不定」や「未定義」に依存しないコードを目指してください。加えて、GNU拡張に依存するより、C99に対応させる方が幾らか安全です。
今回のことは、gccが悪いのではなく、元々内在していた不具合が顕在化しただけと考えてください。
jactaさん、ご回答有難うございます。
ソースコードの添付は、会社のものですのでちょっと厳しいので、部分的に…
int a = 0;
char b[2] = "";
char *c[256] = {0};
こういった、宣言の指定部分で特にエラーが出ているようですので、こちらの表記が問題なのでしょうか。
普段PHPを使用している為、未定義・不定でも動いてしまうプログラミングばかり書いており、C言語の未定義・不定義をあまり意識していなかったのが問題かも知れません。
今後のこともありますので、正しい書き方をもう一度調べてみたいと思います。
No.1
- 回答日時:
どの様なエラーが出るのでしょう?
基本的に、「正しい」プログラミングをしていればあまりないとは思うのですが……
旧版には入れていた追加ライブラリを新版に入れていない、というようなことはありませんか?
OS自体を変更しているようなので、そこに特化した書き方をしているとコンパイルできなくなるかもしれませんね。
この回答への補足
慌ててしまってすみません。エラーの内容を添付しようと思い返し、修正できないことに気付きました。
Trick--o--さん、有難うございます。
具体的なエラーは以下のような感じです。
OSに特化した部分は特にないと思いますものの、以前までsyntaxerrorの出なかった部分がエラーになっていたりと、コンパイラの仕様が変わっているような印象を受けました。
もし、何か気付く点などありましたら、ご教授頂けると幸いです。
mms_send_v2.1.c:101: error: previous definition of 'sql' was here
mms_send_v2.1.c:270: error: parameter `cmd' is initialized
mms_send_v2.1.c:275: error: parameter `haisin_date_tmp' is initialized
mms_send_v2.1.c:276: error: parameter `start_date_tmp' is initialized
mms_send_v2.1.c:277: error: parameter `buf' is initialized
mms_send_v2.1.c:279: error: conflicting types for 'numrows'
mms_send_v2.1.c:103: error: previous definition of 'numrows' was here
mms_send_v2.1.c:281: error: redefinition of parameter 'i'
mms_send_v2.1.c:104: error: previous definition of 'i' was here
mms_send_v2.1.c:283: error: parameter `count' is initialized
mms_send_v2.1.c:286: error: parameter `buffer' is initialized
mms_send_v2.1.c:287: error: parameter `logstr' is initialized
mms_send_v2.1.c:288: error: parameter `file_name' is initialized
mms_send_v2.1.c:290: error: parameter `seg_flg' is initialized
mms_send_v2.1.c:291: error: parameter `seg_tmp_p' is initialized
mms_send_v2.1.c:294: error: parameter `seg_tmp_count' is initialized
mms_send_v2.1.c:297: error: parameter `car_num' is initialized
mms_send_v2.1.c:308: error: syntax error before "sprintf"
mms_send_v2.1.c:1035: error: redefinition of parameter 'row'
mms_send_v2.1.c:267: error: previous definition of 'row' was here
mms_send_v2.1.c:1036: error: redefinition of parameter 'text_tmp'
mms_send_v2.1.c:273: error: previous definition of 'text_tmp' was here
mms_send_v2.1.c:1041: error: parameter `hit_text' is initialized
mms_send_v2.1.c:1042: error: parameter `hit_sub' is initialized
mms_send_v2.1.c:1043: error: parameter `to' is initialized
mms_send_v2.1.c:1044: error: parameter `buf' is initialized
mms_send_v2.1.c:1044: error: redefinition of parameter 'buf'
mms_send_v2.1.c:277: error: previous definition of 'buf' was here
mms_send_v2.1.c:1045: error: redefinition of parameter 'buffer'
mms_send_v2.1.c:286: error: previous definition of 'buffer' was here
mms_send_v2.1.c:1046: error: parameter `cmd' is initialized
mms_send_v2.1.c:1046: error: redefinition of parameter 'cmd'
mms_send_v2.1.c:270: error: previous definition of 'cmd' was here
mms_send_v2.1.c:1047: error: parameter `kujiurl' is initialized
mms_send_v2.1.c:1048: error: parameter `kensyourl' is initialized
mms_send_v2.1.c:1049: error: parameter `tyusen_num' is initialized
mms_send_v2.1.c:1052: error: parameter `sql' is initialized
mms_send_v2.1.c:1052: error: redefinition of parameter 'sql'
mms_send_v2.1.c:269: error: previous definition of 'sql' was here
mms_send_v2.1.c:1053: error: parameter `text_log1' is initialized
mms_send_v2.1.c:1054: error: parameter `text_log2' is initialized
mms_send_v2.1.c:1055: error: redefinition of parameter 'title_tmp'
mms_send_v2.1.c:273: error: previous definition of 'title_tmp' was here
mms_send_v2.1.c:1056: error: parameter `start_count' is initialized
mms_send_v2.1.c:1057: error: parameter `nowcount' is initialized
mms_send_v2.1.c:1058: error: redefinition of parameter 'i'
mms_send_v2.1.c:281: error: previous definition of 'i' was here
mms_send_v2.1.c:1058: error: parameter `j' is initialized
mms_send_v2.1.c:1058: error: redefinition of parameter 'j'
mms_send_v2.1.c:282: error: previous definition of 'j' was here
mms_send_v2.1.c:1059: error: parameter `num' is initialized
mms_send_v2.1.c:1059: error: redefinition of parameter 'num'
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# exeファイルが作れない(windows10) 6 2022/08/13 08:47
- C言語・C++・C# ExcelCS 1 2023/01/27 19:47
- C言語・C++・C# gcc のコンパイラオプションについて 2 2022/12/21 17:11
- Outlook(アウトルック) outlookの送信エラーについて 1 2022/05/13 12:04
- その他(パソコン・スマホ・電化製品) Premiere Proで下記サイト http://www.joshcluderay.com/dow 1 2023/07/17 19:51
- Excel(エクセル) Excel 2019 32ビット・バージョンを➡64ビット・バージョンに 3 2022/09/11 12:49
- ソフトウェア Windows10のOctaveに関する質問です。 1 2022/05/03 09:45
- Windows 10 Windows Updateが動作しません 7 2022/08/12 16:26
- その他(ソフトウェア) Emacsメニューの日本語化について 1 2023/06/16 15:52
- その他(プログラミング・Web制作) pythonのバージョン変更に関する質問 1 2023/02/14 11:39
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
<unistd.h>をVisualStudioでつ...
-
アプリケーションのDLLファイル...
-
実行後にコンパイルに失敗しま...
-
ヘッダーファイル『windows.h』...
-
リトルエンディアン、ビッグエ...
-
signal関数について
-
gccコンパイル時のエラーメッセ...
-
CUnitをDOSベースで使うには...
-
ウィンドウズでobjective cを勉...
-
#ifdef の使い方
-
C言語で作ったらWindowsでもMac...
-
debian/gnu Linuxで並列計算し...
-
C++Builderの選択
-
Cのソースを毎回コンパイルし...
-
AdobeReader8.0の機能を使って...
-
共有ライブラリの内容確認について
-
Ubuntu上でITRONプログラムを作...
-
Visual Basic.NETの処理速度は6...
-
c言語でログイン処理はできます...
-
gccでc++プログラムをコンパイ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
<unistd.h>をVisualStudioでつ...
-
アプリケーションのDLLファイル...
-
実行後にコンパイルに失敗しま...
-
math.hに含まれる関数が使えない
-
シリアル通信の受信待ちについて
-
ビープ音が鳴りません・・・
-
C#で char型とstring型の比較で...
-
c言語です コンパイルした時に...
-
共有ライブラリの内容確認について
-
すべてのリビルド: 0 正常、 0 ...
-
64ビットのlinuxで32ビットメモ...
-
C言語で作ったらWindowsでもMac...
-
MS-BASICの逆コンパイルについて
-
<math.h>ヘッダを入力している...
-
ヘッダーファイル『windows.h』...
-
プレコンパイルの意味を教えて...
-
Verilog_HDLでのdefineとifdef
-
[COBOL] ソースの復帰
-
gcc バージョン違いによるコン...
-
同じEXE・同じファイルで解析結...
おすすめ情報