3

私は現在、特定の文字列の最後の出現を見つけるためfunctionに inを開発しています。文字列の長さが指定されていない場合は、特定の方法 (独自の方法) を使用する必要があります。そのため、少し調べた結果、a が最適であると判断しました。これは私が持っているものです:Ccharstrrchrmacro

 size_t strlchr(const char *str, const char ch, const int strln)
 {
    //function code if strlen == -1 (no parameter)
    //function code if strlen != -1 (parameter given)
 }

#define strlchr_arg2(str, ch) strlchr(str, ch, -1)
#define strlchr_arg3(str, ch, strlen) strlchr(str, ch, strln)
#define getarg4(arg2, arg3, arg4...) arg4
#define strlchr_macro(...) \ getarg4(__VA_ARGS__, strlchr(arg3, \ arg2, )
#define strlchr(...) strlchr_macro(__VA_ARGS__)(__VA_ARGS__)

これは私の目標を達成する正しい方法ですか?それとももっと効率的な方法はありますか?また、ソース ファイルのマクロの前に関数コードを含める必要がありますか? 私は通常、関数を一番下に書き、宣言を (この場合size_t strlchr(const char*, const char, const int)はソース ファイルの一番上に) 書き、最後にマクロなどをソース ファイルの一番上に置きます。したがって、理想的には私のレイアウトは次のようになります。

macros/defines
function declaration
function code

この質問は、私がウェブで見た他の例に完全に基づいています。これは、オプションの関数パラメーターを使用する方法ですか? それとも私は離れていますか?ひどく間違ったことをする前に最初に入力を取得したいので、まだ実装していません(これまでマクロを作成したことがなく、このマクロはほとんどが例から取られたものであり、それが正確に何であるかについてはほとんど理解していませんします)。

4

1 に答える 1

4

実行する方が簡単なようです:

size_t strlchr(const char *str, const char ch, const int strln)
{
    //function code if strlen == -1 (no parameter)
    //function code if strlen != -1 (parameter given)
}


#define strlchr_macro(STR, CH, STRLN, ...) strlchr(STR, CH, STRLN)
#define strlchr(...) strlchr_macro(__VA_ARGS__, -1, -1)

これにより、引数chstrln引数の両方がオプションになり、指定されていない場合はデフォルトで -1 になります。また、3 つ以上の引数を指定することもできます (余分な引数は無視されます)。

于 2012-08-29T18:00:35.677 に答える