スポンサーリンク

このドキュメントの内容は、以下の通りです。

古い g++ でコンパイルするときは、問題にならなかったけど、いつの間にかエラーになってコンパイルできなくなってしまった、というお話です。
どういうわけか、古いコンパイラを使わないといけない環境に長いこといたせいか、現代のGNU g++の環境にソースコードを持ってきてコンパイルしようとしたらエラーが続出でびっくりしました。
とりあえず、コンパイルしてくれてもいいじゃない?とか思うのですが、そういうわけにもいかないので、いろいろ直すことになりました。

サンプルコード


たとえば、このようなソースコードを書きます。

#include <iostream>
#include <cstdlib>
using namespace std;

void func ( int id = 0 );

void func ( int id = 0 ) {
	return;
}

int
main (int argc, char *argv[])
{

	func ( );

	exit (EXIT_SUCCESS);
}

コンパイルするとデフォルト引数でエラーが出る


コンパイルしてみます。

% g++ -Wall default_arg.cc
default_arg.cc: In function 'void func(int)':
default_arg.cc:7: error: default argument given for parameter 1 of 'void func(i'
default_arg.cc:5: error: after previous specification in 'void func(int)'
1で終了しました

g++コンパイラさんが親切にも
デフォルト引数が与えられているとか、
前に指定しているとか、ゴチャゴチャ言ってきます。

何が悪いのか?


プロトタイプ宣言部と関数宣言の両方で、デフォルト引数を設定しているのが問題でした。

具体的には、この部分です。
void func ( int id = 0 );

void func ( int id = 0 ) {
	return;
}

そもそもこのレベルのプログラムでプロトタイプ宣言しなくてもいいじゃない、というのはなしです。
ヘッダファイルに宣言して、ほかのプログラムから利用させるということにしておいてください。

プロトタイプ宣言は、関数のパラメータがどうなっているのか、コンパイラにおしえるものなので、こちらにデフォルト引数を指定します。
ライブラリとして提供する場合、ライブラリを利用するプログラムは、ヘッダファイルをインクルードして使います。
そのときに、デフォルト引数が何個あるのか、知らないとコンパイラが困ります。
デフォルト引数として宣言していないと、必ず、引数をセットしないといけなくなります。

というわけで、関数宣言部分からデフォルト引数を削除します。

void func ( int id = 0 );

void func ( int id ) { // ここの id = 0 を id だけにしました。
	return;
}

これで問題は、解決しました。

スポンサーリンク
スポンサーリンク
 
いつもシェア、ありがとうございます!


もっと情報を探しませんか?

関連記事

最近の記事

人気のページ

はてなの人気のブックマーク

スポンサーリンク
 

過去ログ

2019 : 01 02 03 04 05 06 07 08 09 10 11 12
2018 : 01 02 03 04 05 06 07 08 09 10 11 12
2017 : 01 02 03 04 05 06 07 08 09 10 11 12
2016 : 01 02 03 04 05 06 07 08 09 10 11 12
2015 : 01 02 03 04 05 06 07 08 09 10 11 12
2014 : 01 02 03 04 05 06 07 08 09 10 11 12
2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12

サイト

Vim入門

C言語入門

C++入門

JavaScript/Node.js入門

Python入門

FreeBSD入門

Ubuntu入門

セキュリティ入門

パソコン自作入門

ブログ

トップ


プライバシーポリシー