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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

4回答

1142閲覧

公開用フラグ, 内部用フラグの共用

_nyannyan_

総合スコア124

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

1グッド

0クリップ

投稿2018/02/05 05:51

C APIを設計しています。
処理自体の記述にはC++を用いています。
ある関数の引数にenum型の変数を渡します(動作モードを指定するものだと思ってください)。
ユーザーには公開したくない動作モードを作ろうと思っています。

一つの方法としては公開用のenumと内部用のenumを定義して、呼ばれた関数内で公開用から内部用にキャストする方法が考えられます。
しかしこの場合本質的に同じものを2回定義することになり、片方だけ更新したけどもう片方は更新し忘れたなどの原因でバグが出やすくなると思います。
何とかして記述の重複を避ける方法はないでしょうか?

C

1//user.c 2#include "API.h" 3int main(){ 4 device_run(normal_mode); 5 return 0; 6}

C

1//API.h 2//公開用enum 3typedef enum{ 4 public_normal_mode, 5 public_fast_mode 6} public_device_mode_t; 7void device_run(public_device_mode_t mode);

C

1//API-impl.h 2#include "API.h" 3//実装用enum 4typedef enum{ 5 private_normal_mode, 6 private_fast_mode, 7 private_maintainance_mode // 隠したいモード 8} private_device_mode_t;

C++

1// API-impl.cpp 2#include "API-impl.h" 3void device_run(public_device_mode_t mode){ 4 switch(static_cast<private_device_mode_t>(mode)){ 5 case private_normal_mode: 6 /* run as normal mode */ 7 case private_fast_mode: 8 /* run as fast mode */ 9 case private_maintainance_mode: 10 /* run as maintainance mode */ 11 } 12}
yohhoy👍を押しています

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

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

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

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

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

himakuma

2018/02/05 06:22

公開動作モードはライブラリのような形で公開するようなイメージでしょうか?
guest

回答4

0

ベストアンサー

どうせC言語のenumは内部的には数値なので、内部用のenumを、インデックスを思いっきりずらして作っておいて、ただのintで引数を取るような形にする、ということでいいのではないかと思います。

C

1enum { private_maintainance_mode = 0x1000 }; 2 3void device_run(int mode);

投稿2018/02/05 06:34

maisumakun

総合スコア145183

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

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

0

引数から動作モードを判断するより、専用の関数を用意したほうがよいのではと思います。
device_run_normal()
device_run_fast()
のような。
こうすれば、使う側はenum値を気にしなくて良くなります。

投稿2018/02/05 06:21

ttyp03

総合スコア16998

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

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

0

こんにちは。

ちょっと無理矢理感が漂いますが、要件は満たしていると思います。

C++

1//user.c 2#include "API.h" 3int main(){ 4 device_run(public_normal_mode); 5 return 0; 6}

C++

1//API.h 2//公開用enum 3typedef enum{ 4 #include "API.inc" 5} public_device_mode_t; 6void device_run(public_device_mode_t mode);
//API.inc public_normal_mode, public_fast_mode

C++

1//API-impl.h 2#include "API.h" 3//実装用enum 4enum class private_device_mode_t 5{ 6 #include "API.inc" 7 , private_maintainance_mode // 隠したいモード 8};

C++

1// API-impl.cpp 2#include "API-impl.h" 3void device_run(public_device_mode_t mode){ 4 switch(static_cast<private_device_mode_t>(mode)){ 5 case private_device_mode_t::public_normal_mode: 6 /* run as normal mode */ 7 break; 8 case private_device_mode_t::public_fast_mode: 9 /* run as fast mode */ 10 break; 11 case private_device_mode_t::private_maintainance_mode: 12 /* run as maintainance mode */ 13 break; 14 } 15}

wandbox

投稿2018/02/05 07:19

Chironian

総合スコア23272

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

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

0

内部用のヘッダファイルから公開用のヘッダファイル(内部用のenum定義要素を削る)を生成するスクリプトを書いて自動生成にしとけばいいんでは?

投稿2018/02/05 06:20

a_saitoh

総合スコア702

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問