質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

Q&A

解決済

1回答

515閲覧

【Rust】feature deriveマクロは関数や構造体の上にしかつけれないのでしょうか?

KOTTON

総合スコア47

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

0グッド

0クリップ

投稿2022/02/06 06:32

編集2022/02/08 15:48

追記

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

背景、やりたいこと

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

rust

1use LIBRARY_NAME::A::FUNCTION_NAME; 2// use LIBRARY_NAME::B::FUNCTION_NAME などはできないようにする

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

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

src -- lib.rs |-- A |-- mod.rs |-- A.rs |-- B |-- mod.rs |-- B.rs

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

rust

1#[cfg(feature = "A")] 2pub mod A; 3 4#[cfg(feature = "B")] 5pub mod B;

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

rust

1#[cfg(feature = "A")] 2pub mod A; 3pub use A::*;

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

rust

1#[cfg(feature = "B")] 2pub mod B; 3pub use B::*;

問題

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

rust

1use LIBRARY_NAME::B::FUNCTION_NAME;

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

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

投稿2022/02/10 13:04

KOTTON

総合スコア47

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問