

[teratail](https://teratail.com/questions/kvevl0uio3c62x)でも同じ質問をさせていただきましたが、回答を得れていないためこちらでも質問させていただきます！

# 追記

以下の情報はすべてこのリポジトリに関するお話を抽象化したものです。  
<https://github.com/s3pt3mb3r/toy-arms>  
このリポジトリには `internal` と `external` と名のついたフォルダーと、featureがあります。  
それぞれのフォルダー内のファイルに記述されたpublic関数は、対応するfeatureがonの場合でないと、外部のライブラリ使用者からuseできないようにしたいです！

# 背景、やりたいこと

自分のlibプロジェクトのsrc配下のファイルを、機能カテゴリごとにフォルダわけしたいなと思いたちました。  
AとBのフォルダがあったとして、理想としては、ライブラリの使用者側で`features = ["A"]`を指定した場合は

[code]

    use LIBRARY_NAME::A::FUNCTION_NAME;
    // use LIBRARY_NAME::B::FUNCTION_NAME などはできないようにする
    
[/code]

という感じで指定する形にしたいです。

現在ファイル構造は以下のようになっています。

[code]

    src -- lib.rs
        |-- A
              |-- mod.rs
              |-- A.rs
        |-- B
              |-- mod.rs
              |-- B.rs
    
[/code]

`src/lib.rs`は以下のようになっています。

[code]

    #[cfg(feature = "A")]
    pub mod A;
    
    #[cfg(feature = "B")]
    pub mod B;
    
[/code]

`A/mod.rs`は以下のようになっています。

[code]

    #[cfg(feature = "A")]
    pub mod A;
    pub use A::*;
    
[/code]

`B/mod.rs`も、Aと同じように以下のようになっています。

[code]

    #[cfg(feature = "B")]
    pub mod B;
    pub use B::*;
    
[/code]

# 問題

ただこれだと、現状使用者側から、`features = ["A"]`と指定しても

[code]

    use LIBRARY_NAME::B::FUNCTION_NAME;
    
[/code]

がなぜか使えるようになっています。  
関数や構造体の上に逐次`#[cfg(feature = "A")]`などとアノテートしていけばいいのはわかるのですが、もっと楽な方法はありませんか？


CC BY-SA 4.0
2022-02-06T09:07:40.193
86173
2022-02-10T13:04:21.470
2022-02-08T15:49:11.560
25969
25969
question
rust
feature deriveマクロは関数や構造体の上にしかつけれないのでしょうか？


pappyさんのコメントを発端として解決しました。  
`--no-default-features` フラッグもしくはdependencies内に`default-
features=false`を付けてデフォルトのfeatureを無効にすることで使えなくなることが確認できました。


CC BY-SA 4.0
2022-02-10T13:04:21.470
86255
2022-02-10T13:04:21.470
25969
86173
answer