dポイントプレゼントキャンペーン実施中!

関数のプロトタイプ宣言と、それに関するwarningsプラグマについてお教えください。

関数のプロトタイプ宣言は、その関数を呼び出す側がコンパイルされる時点で、すでに存在する必要があり、また、use warningsによってプラグマを有効にしておくと、遅いプロトタイプ宣言について警告してくれると理解していました。

以下の2例は、どちらもプロトタイプ宣言が遅いために、うまくプロトタイプが働かない例です。
しかし、(例1)ではwarningが表示されるのに対し、(例2)では表示されません。

どこか私の理解が誤っているのかと思うのですが、このようになる理由についてご教授いただきたく、よろしくお願いいたします。

■ (例1)
#!/usr/bin/env perl
# -*- mode: cperl; coding:utf-8 -*-

use strict;
use warnings;

my @a= 1..4;
mypush( @a, 5..8);
print join( ",", @_), "\n";

sub mypush(@@){
if( @_== 2){
print "ok.\n";
}else{
print "Prototypes does not work, arg. num=", 0+ @_, "\n";
}
}

□(出力1)
main::mypush() called too early to check prototype at ./chk_prototype.pl line 10.
Prototypes does not work, arg. num=8

■(例2)
#!/usr/bin/env perl
# -*- mode: cperl; coding:utf-8 -*-

use strict;
use warnings;

test_2();
exit 0;

sub test_2{
my @a= 1..4;
mypush( @a, 5..8);
print join( ",", @_), "\n";
}

exit 0;

sub mypush(@@){
if( @_== 2){
print "ok.\n";
}else{
print "Prototypes does not work, arg. num=", 0+ @_, "\n";
}
}

□(出力2)
Prototypes does not work, arg. num=8

----

なお、Perlは、
perl -v
This is perl, v5.10.1 (*) built for x86_64-linux-thread-multi
を使用しております。

A 回答 (1件)

実際には実行しておりませんので、あまり本気にとらえないで下さい。



sub name(prt)はコンパイラが見るものです。
ブロックは実行中に定義されるものです。

まず書式の順番がおかしいです。
プロトタイプを使うのなら、BEGINするか、useするのが普通です。(使わなくてもします)。
テストの場合は、最低でも冒頭で関数の宣言のみをおこなうべきです。

実行中に未定義の関数が使用された場合、Perlはその場で関数を探し始めます。
これは当然警告が出ます。

プロトタイプが正常に機能してると証明出来るのは、
foo 1, 2;
とカッコを省いて書ける場合です。
これはコンパイラにすでに(組み込み関数と同じように)畳み込まれているためそうなりますし、
またこの記法が通れば処理の順序がおかしくないことの証明となります。

通常は組み込み関数で引数にカッコを使わないのと同様、
(記述がややこしくならない限り)プロトタイプもカッコを使いません。


--------------------


二点目。
プロトタイプ@@は無意味です。
これは
(@araay1, @araay2);
このカッコが何を出力するのが、と言うのと同じ問題です。
    • good
    • 0
この回答へのお礼

プロトタイプ宣言の正しい使い方を知りたいのではなく、
プロトタイプ宣言を誤って使った場合の、usewarningsプラグマの動作について知りたいのです。

サンプルのプログラムのミスのご指摘、ありがとうございました。
今更ではありますが、訂正させていただきます。

お礼日時:2012/08/11 23:11

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


このQ&Aを見た人がよく見るQ&A