1

これは非常に未熟な質問ですが、私は nix ベースのツールを作成しており、渡された vvv の数に基づいて詳細フラグを設定したいと考えており、プログラムでデバッグ/情報ステートメントを出力します。

私の質問は、optargs は一度に 1 文字しか解析できないため、これに opargs を使用するにはどうすればよいかということです。

また、冗長レベルが 3 であることがわかっている場合、すべての print ステートメントを if 条件にする必要がありますか? または、プリプロセッサを使用してそれを行う賢い方法はありますか?

また、誰かがオンラインでこれを行うコードを教えてくれたら、それは素晴らしいことです。

ありがとう

私はそれを理解し、他の誰かが将来これに出くわした場合、ここに投稿すると思いました:

基本的に、さまざまな冗長ステートメントすべてに対して、次のようなプリプロセッサを使用して特別な出力を定義しました。

#define dprintf \
    if (verbosity == 1) printf

次に、必要に応じてステートメントをコードに挿入します。

dprintf ("Verbosity is at level 1.");

私のopt atgsは次のようになります

case 'v':
    verbosity++;
break;
4

3 に答える 3

3

詳細レベルはコンパイル時にはわからないため、ユーザーが選択した任意のレベルを処理できるようにコードを用意する必要があります。

これを行う簡単で理解しやすい方法は、詳細レベルを追跡する静的変数を使用して、不透明なコンパイル ユニット内のロギング関数を分離することです。次に、これを「set_logging_level(level)」などで初期化し、この静的変数によって保護されたログ関数を記述します。次に、初期化関数とログ関数のみを公開し、コードで必要に応じて使用します。

static level = 0;
void set_logging_level(int l) { level = l; }

void log_info(char* msg) {
  // Will always print
}

void log_debug(char *msg) {
  if(level > 0)
    // Write to stdout or stderr, whichever fits
}

void log_details(char *msg) {
  if(level > 1)
    // As above
}

void log_insanity(char *msg) {
  if(level > 2)
    // As above
}

編集:ロギングのより健全な条件。特に、詳細レベルが上がったときに包括的なログが必要な場合は...

于 2012-04-16T16:12:48.340 に答える
1

条件付きコンパイルはどうですか?

多くのvを渡す代わりに、冗長レベルの数値を設定することで簡素化することもできます。

#if VERBOSE_LEVEL == 3
  print("A verbose message");
#endif
于 2012-04-16T16:06:32.430 に答える
0

これがあなたの意図したものかどうかはよくわかりませんが、これは私が別のプロジェクトでそれを実装した方法です:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define TRUE    1
#define FALSE   0

int usage( char *name, int quit );

int main (int argc, char **argv) {
    int c;
    static int vlevel = 0;

    while ( (c = getopt(argc, argv, ":abc:d:hv012")) != -1) {
        int this_option_optind = optind ? optind : 1;
        switch (c) {

            case 'v':
                vlevel++;
                printf ("verbosity level is %d\n", vlevel);
                break;

            case ':':       /* Option without required operand */
                fprintf(stderr, "option -%c requires an operand\n", optopt);
                break;

            case 'h':
            case '?':
                usage( argv[0], TRUE );
                break;

            default:
                printf ("?? getopt returned character code 0%o ??\n", c);
        }
    }

    if (optind < argc) {
        printf ("non-option ARGV-elements:\n");
        while (optind < argc)
            printf ("\t%s\n", argv[optind++]);
    }

    exit (0);
}

int usage( char *progname, int quit )
{
    printf ( "Usage:\n\t%s [-vh]\n", progname );
    if ( quit ) exit( 1 );
    return 0;
}

これにより、次のような結果が得られます。

eroux@smaug:~$ ./testverbose -h
Usage:
    ./testverbose [-vh]
eroux@smaug:~$ ./testverbose -vvvv
verbosity level is 1
verbosity level is 2
verbosity level is 3
verbosity level is 4
eroux@smaug:~$ 

そこから、[main() で] vlevel 変数を使用して、関連する詳細レベルで正しいメッセージを出力できるはずです。

于 2012-04-16T17:15:21.930 に答える