- PR -

ライブラリ定義の定数について

投稿者投稿内容
おじか
ベテラン
会議室デビュー日: 2002/12/04
投稿数: 57
お住まい・勤務地: 埼玉県
投稿日時: 2004-07-13 18:27
こんにちわ
自分で作成したライブラリを組み込んだプログラムで
ライブラリで定義されている定数と同一名の変数を定義してしまいました。
この場合、変数の値が優先されてしまうようです。
定義されている定数値は無視されてしまいます。


たとえば ライブラリでabc=1という定数を定義をして、
ソース上でdim abc as shortと定義した場合
変数abcに代入された値が優先され abc=10と代入するとabcは10になります

vblfのようなVB定義の定数も同様のようです。

二重定義のエラーのような物は出せないのでしょうか?
ご存知のかたいらしたら教えてください。
よろしくお願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-07-13 18:28
名前空間

これじゃわかりづらいか。

1つのファイルに、次のように定義する。
コード:

namespace foo
Public Const hage As Integer = 1
end namespace

namespace baa
Public Const hage As Integer = 2
end namespace


さて、どうなるでしょう?

↓↓一郎さん:フォローどうも

[ メッセージ編集済み 編集者: Jitta 編集日時 2004-07-14 08:28 ]
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2004-07-13 18:56
Namespaceの下に変数は置けないのでは。

やるならこうかな。
コード:
Namespace foo
    Public Class A
        Public Const hage As Integer = 1
    End Class
End Namespace

Namespace baa
    Public Class A
        Public Const hage As Integer = 2
    End Class
End Namespace

なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-07-13 20:26
引用:

おじかさんの書き込み (2004-07-13 18:27) より:
たとえば ライブラリでabc=1という定数を定義をして、
ソース上でdim abc as shortと定義した場合
変数abcに代入された値が優先され abc=10と代入するとabcは10になります

vblfのようなVB定義の定数も同様のようです。

二重定義のエラーのような物は出せないのでしょうか?


基本的に同名の識別子は、内側のものが優先されるようになっているので、多分エラーにするようなことはできないでしょう。
包含する型が別物である場合や、ローカルに定義した変数などは、たとえアクセスするための記述が同じになる名称のものでも、外側で定義されたものとは衝突しないので…
あみゅせる
常連さん
会議室デビュー日: 2004/07/08
投稿数: 33
お住まい・勤務地: 神奈川県
投稿日時: 2004-07-13 21:19
さすがに、完全一致すると警告(CS1595)がでます。
リファレンス順序の先の定義を採用するようですが、
IDE上だとあまり意識しないですね。
プロジェクトの追加順かしら。
_________________
おじか
ベテラン
会議室デビュー日: 2002/12/04
投稿数: 57
お住まい・勤務地: 埼玉県
投稿日時: 2004-07-14 11:25
みなさん、ありがとうございます。

私が作ったライブラリを使ってる人から動かないという指摘を受けて
調べてみたら、ライブラリ定義の定数と同名の変数が定義されており
定数の値が参照されていなかったということがあったので。

当たり前の話ですが、同名の変数と定数はソース上には定義できません。
これと、同じことが出来ればと思ってるんですが。

あみゅせるさんへ

引用:

あみゅせるさんの書き込み (2004-07-13 21:19) より:
さすがに、完全一致すると警告(CS1595)がでます。
リファレンス順序の先の定義を採用するようですが、
IDE上だとあまり意識しないですね。
プロジェクトの追加順かしら。




具体的にどういったときに出るのか教えていただけるとありがたいです。
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2004-07-14 12:40
おじかさん、こんにちは。

引用:

当たり前の話ですが、同名の変数と定数はソース上には定義できません。
これと、同じことが出来ればと思ってるんですが。


調べてませんので、出来るか出来ないかは判りません。

解決策としては Imports ステートメント(using ディレクティブ)を使用しないようにしてもらうか(現実的でないかも)、エイリアスを使う(こっちの方がスマート)ようにしてもらうかの、どちらかではないでしょうか。

引用:

具体的にどういったときに出るのか教えていただけるとありがたいです。


ですから、名前空間も含めて完全に一致した場合、じゃないですか?
あみゅせる
常連さん
会議室デビュー日: 2004/07/08
投稿数: 33
お住まい・勤務地: 神奈川県
投稿日時: 2004-07-14 15:59
こんにちは。
引用:

具体的にどういったときに出るのか教えていただけるとありがたいです。


ちょっとニュアンスが離れてたみたいです。

あるライブラリの中身が、
コード:
Namespace Hoge
    Public Class foo
        Public Const abc As Integer = 1
    End Class
End Namespace


でこれを参照したプロジェクトから
コード:
Namespace Hoge
    Public Class foo
        Public abc As Integer
    End Class
End Namespace


なんてことをすると「Hoge.foo.abc」どころか
「Hoge.foo」の定義時点で怒られます。

但し、VBではソースに見えないところで
ルート名前空間なるプロジェクト名を名前空間の初期値に
設定するので、何もしないと
ライブラリ名.Hoge.foo.abc
アプリ名.Hoge.foo.abc
と、競合を避けてしまいます。
_________________

スキルアップ/キャリアアップ(JOB@IT)