プロが教える店舗&オフィスのセキュリティ対策術

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のバージョンによるコンパイルエラーを乗り越えた方、ご指摘など有りましたらお教えくださると幸いです。

A 回答 (5件)

> ソースコードの添付は、会社のものですのでちょっと厳しいので、部分的に…



全文は必要ないのです。エラーが発生した部分を、エラーが再現可能な形で提示してもらえれば、おそらく問題点を指摘できます。

> 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;

のように、同じ変数を二回初期化した場合です。
    • good
    • 0
この回答へのお礼

jactaさん、ご回答有難うございます。
エラーの行が多すぎて、エラー箇所を特定できないのが現状です。
もしかしますと、初期化を二回行ってしまっているかも知れません・・・。
特に、他の関数で使われている、同名の変数でエラーが発生しているみたいですので、この辺をチェックし、もう一度ソースを見直してみることに致します。

お礼日時:2006/02/07 09:39

GCCで、2.95.4から3.4.2までのバグフィックスに目を通せば


大概のことは書いていますよ。

私も同様の状況になり、上記の方法で解決しました。

お手軽な方法だと、確かコンパイル時にオプションで
指定バージョンに落とせたと思いましたが、どうでしょう。。。
    • good
    • 0
この回答へのお礼

f_attckさん、ご回答有難うございました。
バグフィクスですね。どうも英語が得意でなくて、避けておりましたが・・・それじゃ駄目ですよね。
これからは、ソフトの仕様も把握してから致します。
バージョンダウン、そんなに簡単にできるのですか!
お教えくださって有難うございます。
もう一度、gccのサイトを調査してみます。

お礼日時:2006/02/07 09:43

C99規格やC++では宣言の位置に関する規定が無くなって(?)いますが、


見易さを考慮すると宣言は一箇所にまとめたほうがいいと思います。
また、ひとつの関数はひとつの仕事だけをするようにすれば、宣言の重複もおきにくくなると思います。
    • good
    • 0
この回答へのお礼

Trick--o--さん、再度ご教授を有難うございます。
同じような関数が何個も存在しているため、細かなミスが随所にあるのかも知れません。
人の作ったプログラムでしたので、あまり弄ることができず・・・。
この辺も、慣れてゆくしかないですよね。

お礼日時:2006/02/07 09:41

バージョンが2.xから3.xに変わったときに出るコンパイルエラーの多くは、処理系の癖に依存するコーディングをしていたことが原因です。

具体的なエラーメッセージとソースコードがわからないと正確なことは何もわかりません。

他に、コンパイルエラーは出なくても、部分式の評価順序が変わっていたりするので、規格上、「不定」にあたる動作した実装をしていると、実行時に振る舞いが変わったりします。

バージョンダウンはできると思いますが、将来にわたって不安を残すことになるので、この機に修正することをお勧めします。なお、gccの最新バージョンは4.0.2です。3.xと4.xではまた異なるので、「不定」や「未定義」に依存しないコードを目指してください。加えて、GNU拡張に依存するより、C99に対応させる方が幾らか安全です。

今回のことは、gccが悪いのではなく、元々内在していた不具合が顕在化しただけと考えてください。
    • good
    • 0
この回答へのお礼

jactaさん、ご回答有難うございます。
ソースコードの添付は、会社のものですのでちょっと厳しいので、部分的に…

int a = 0;
char b[2] = "";
char *c[256] = {0};
こういった、宣言の指定部分で特にエラーが出ているようですので、こちらの表記が問題なのでしょうか。
普段PHPを使用している為、未定義・不定でも動いてしまうプログラミングばかり書いており、C言語の未定義・不定義をあまり意識していなかったのが問題かも知れません。
今後のこともありますので、正しい書き方をもう一度調べてみたいと思います。

お礼日時:2006/02/06 11:15

どの様なエラーが出るのでしょう?


基本的に、「正しい」プログラミングをしていればあまりないとは思うのですが……
旧版には入れていた追加ライブラリを新版に入れていない、というようなことはありませんか?

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'

補足日時:2006/02/06 10:53
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!