2017-12-15 3 views
5

私は答えがいいえではないと思いますが、通常はソースコードを調べるのに問題はありませんが、私はC/C++のやや新しく、この定数が宣言されている場所を見つけることができません。決して定義/宣言されていないC定数を参照する方法はありますか?

CMD_REQ_REDIS_MGETThe hiredis-vip client library for Redisで探しています。私はこれについてgithub/google検索を行い、5回の出現のために正確に2つのファイルに結果を得ました。私はまた、ソースコードの文字列をgrepしようとしました。

$ grep -rnw ./ -e "CMD_REQ_REDIS_MGET" 
./command.c:241: case CMD_REQ_REDIS_MGET: 
./command.c:574:     r->type = CMD_REQ_REDIS_MGET; 
./hircluster.c:3257:  if (command->type == CMD_REQ_REDIS_MGET) { 
./hircluster.c:3446:  if (command->type == CMD_REQ_REDIS_MGET) { 
./hircluster.c:3480: if (command->type == CMD_REQ_REDIS_MGET) { 

ソースコードにはバイナリが含まれておらず、自己完結型であると考えられています。 Redisに関連する外部ソースからのライブラリは含まれていないので、数時間混乱してしまいました。

私が知る必要があるのは、同じような別の定数を追加しようとしていることです。宣言が見つからないというエラーが発生し続けているので、ここでは黒い魔法が発生しているのでしょうか?私が気づいていないCです。

編集:このコードは実際にはそのままコンパイルされることを指摘したい。

+0

適切なレベルでgrepを実行していますか?そのような定義は通常、.hファイルにあります。 –

+0

@ Jean-FrançoisFabre私はgit repoのルートでそれを実行しています –

答えて

10

以前に宣言されていない定数は使用できません。しかし、その場合、定数は宣言されましたが、自明ではありません。

それらの値がトークン貼り付け(古いものを組み合わせることによって、新しいIDを作成します##演算子)を使用してcommand.hからマクロで定義されているので、あなたが(それはヘッダファイルにする必要があります)どこかの文字列を見つけることができません。

#define DEFINE_ACTION(_name) CMD_##_name, 
typedef enum cmd_type { 
    CMD_TYPE_CODEC(DEFINE_ACTION) 
} cmd_type_t; 
#undef DEFINE_ACTION 

だから、CMD_とあなたの接尾辞は決して見つかりません。その後、いくつかの魔法(マクロ名は、おそらくどこかの時点で再定義される)によって、以下のすべての要素を定義します。

#define CMD_TYPE_CODEC(ACTION)                  \ 
    ACTION(UNKNOWN)                    \ 
    ACTION(REQ_REDIS_DEL)     /* redis commands - keys */       \ 
    ACTION(REQ_REDIS_EXISTS)                  \ 
    ACTION(REQ_REDIS_EXPIRE)                  \ 
    ACTION(REQ_REDIS_EXPIREAT)                 \ 
    ACTION(REQ_REDIS_PEXPIRE)                  \ 
    ACTION(REQ_REDIS_PEXPIREAT)                 \ 
    ACTION(REQ_REDIS_PERSIST)                  \ 
    ACTION(REQ_REDIS_PTTL)                  \ 
    ACTION(REQ_REDIS_SORT)                  \ 
    ACTION(REQ_REDIS_TTL)   

このようなマクロは、コピー/ペーストを避けるために非常に便利ですが、あなたがしようとしている地獄ですgrepを使ってコード内で自分の道を見つけてください。

+0

ああ、可能なことを知っていませんでした。私はCマクロについてさらに研究します。私のためにこれを調べてくれて本当にありがとう! (私が許可するとすぐに受け入れます) –

+2

'##'は*トークンペースト*演算子です。単一の '# '文字(ここでは使用されていません)は*文字列化*(" *文字列* "ではなく)演算子です(標準ではその用語を使用しているとは思わない)。 –

+0

@KeithThompsonはい、私は名前があまりよくありません。私は編集します。 –

関連する問題