40667

[code]

    enum { SYMBOL=100 } /* ASCII文字コードで指定する */
    
[/code]

上記のように定数を定義していますが、`SYMBOL`は`strtok_r()`の2つめの引数として`(const
char*)SYMBOL`の形で使用するだけです。  
コンパイル時にエラーは出ないので文法的な辻褄はあっていると思うのですが、このような場合はやはり`enum`を使わずに下記のように定義するときに(コメントでなくプログラムとして)使用目的を明示するべきでしょうか？

[code]

    const char* SYMBOL = "d";
    
[/code]

<774RRさんからの返答を受けて主に以下の点について質問文を修正しました>  
`enum`でまとめて定義するときはそれらが1つのグループであるかを考えるべきという視点から見ると`SYMBOL`は明らかに仲間外れで別に定義するほうが自然でした。  
なお、`SYMBOL`の使用目的は`strtok_r()`の2つめの引数である`delim`です。  
(返答を読んで改めて調べなおしたりしているうちに、自分が"何を分かっていなかったのか"とか"どこを遠回りしていたのか"が少しづつ見えてきた気がします……。)


CC BY-SA 3.0
2017-12-31T05:44:25.690
40637
2018-01-02T09:11:35.220
2018-01-02T09:11:35.220
25936
25936
question
c
int型としては使わない定数をenumで定義してもいいでしょうか？


`enum` は一つのオブジェクト（変数）に格納する数値に名前を付けたい場合に使うわけで

[code]

    enum e_go_ranger_colors {
        AKA, AO, KI, MOMO, MIDO
    };
    
[/code]

明らかに [ `char` に格納する値 ] でない `SYMBOL` を `enum`
に含めてしまうのはオイラ的には変です（オイラ個人の選択肢としてはありえない）。

警告 `initialization makes pointer from integer without a cast`
は文章の通り、キャストを明示すれば消えます。  
[c](/questions/tagged/c "'c' のタグが付いた質問を表示") `const char* SYMBOL=(const
char*)(100);`  
[c++](/questions/tagged/c%2b%2b "'c++' のタグが付いた質問を表示") `const char*
SYMBOL=reinterpret_cast<const char*>(100);`

以下蛇足。

[code]

    const char SYMBOL=100;
    printf("%p\n", &SYMBOL);
    
[/code]

で出力される値は `100` ではないことのほうが普通です。その意味で `const char SYMBOL=100`; としたうえで `&SYMBOL`
を使うのと `const char* SYMBOL=100;` とは全く挙動が異なります。なのでオイラには当該 `SYMBOL`
を具体的にどういう目的でどんな形で使うのか想像がつきません。その辺の解説があると別提案が（オイラ以外からも）出るでしょう。

マイコンの世界だと `100` 番地 (`0x64` 番地)
に有効な何かがあるのは普通のことです。割り込みベクタだったり、周辺回路レジスタだったり、普通に変数だったり。なので余計に想像つかなかったりします。

\--- 以上は編集前の質問内容に対する回答としてそのまま残しておいて以下追記 ---

`strtok_r` の第二引数は `'\0'` で終端されたデリミタ文字の列であるわけで  
<https://linuxjm.osdn.jp/html/LDP_man-pages/man3/strtok.3.html>  
最低でも `char[2]` の先頭を指すポインタでなければなりません。なので１文字である `SYMBOL`
へのポインタを渡すのはおかしいことになります（既に回答されていますね）

値 `100` は `0x64` つまり ASCII では小文字の d ですから、これを区切り文字に使いたいのであれば `strtok_r(元文字列,
"d", &saveptr)` のように呼ぶことになりますし、以下別回答の通りっす。


CC BY-SA 3.0
2018-01-01T23:03:01.617
40661
2018-01-02T09:09:12.627
2018-01-02T09:09:12.627
8589
8589
40637
answer

[code]

    const char* SYMBOL = (const char*) 'd';
    
[/code]

これは、`SYMBOL` を `strtok_r()` の第2引数 `delim` に渡すなら、おそらく

[code]

    const char* SYMBOL = "d";
    
[/code]

ではないでしょうか。

もし、`"d"` と文字列で直接書くのでなく、文字コードを別に定義しておきたい、ということであれば、

[code]

    /* strtok_r() の区切り文字の文字コード */
    #define SYMBOL_CHARCODE 100
    
    const char SYMBOL[2] = { SYMBOL_CHARCODE, 0 };
    
[/code]

とすることもできます。

`#define` の代わりに `enum` を使うこともできますが、`enum` は 774RR
さんの例にあるような一連の定数をひとまとめに定義するためのものであって、単体で(または無関係な定数と一緒に)定義するためのものではないので、ここで
`enum` を使うことにはとても違和感を感じます。


CC BY-SA 3.0
2018-01-02T08:37:06.947
40667
2018-01-02T08:37:06.947
5288
40637
answer