「C++では引数が違うと別関数扱いになる」
って、今月に、会社で教えもらったんだけど、衝撃を受けた。
ググるとヤフー知恵袋がヒットした。
C言語で関数名は同じで、引数の数が違う関数を使うことはできませんか?
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1334848673
#include<stdio.h>
void aaa(void){
// 明示的に引数をvoidで書きましたが、
//C++では空の引数はvoidであると決められています。
//逆にCでは省略はvoidとは解釈されない場合もあるので
//明示する癖をつけたほうがいいと思います。
printf("called 'void'\n");
}
void aaa(int a){
printf("called 'int' %d\n",a);
}
void aaa(int a, char* msg){
printf("called int %d / %s\n",a,msg);
}
int main(){
aaa();
aaa(1);
aaa(2,"with strings");
return 0;
}
環境
OS:windows7 32bit (自作機)
コンパイラ:Borland C++ 5.5.1 for Win32
解説
これを
C:\2014\0628\004.c
C:\2014\0628\005.cpp
として、Borland C++ 5.5.1 for Win32でコンパイルしてみた
004.cをコンパイルしてみる
C:\2014\0628>bcc32 004.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
004.c:
エラー E2238 004.c 7: 'aaa' の宣言が複数見つかった
エラー E2344 004.c 3: 一つ前の 'aaa' の定義位置
エラー E2193 004.c 12: 呼び出し時のパラメータが足りない:aaa(関数 main )
エラー E2227 004.c 14: aaa の呼び出しに余分なパラメータがある(関数 main )
*** 4 errors in Compile ***
となり、C言語としてコンパイルするとエラーが出た。
005.cppをコンパイルして実行してみる
C:\2014\0628>bcc32 005.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
005.cpp:
エラー E2285 005.cpp 12: 'aaa()' に一致するものが見つからない(関数 main() )
*** 1 errors in Compile ***
C:\2014\0628>bcc32 005.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
005.cpp:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
C:\2014\0628>005.exe
called 'void'
called 'int' 1
called int 2 / with strings
となり、引数が違う関数が別関数として扱われているのがわかる。