web-dev-qa-db-ja.com

ラベルはステートメントエラーの一部としてのみ使用できます

私はフォーラムを調べてきましたが、自分の状況に当てはまるこの質問に対する答えが見つかりませんでした。 「ソート」(unix)を使用してシステムコールを作成しようとしていますが、「ラベルはステートメントの一部にしかならず、宣言はステートメントではありません」というエラーを受け取ります。エラーの原因となっているコードは次のとおりです。

int processid;  
switch(processid = fork()){                 //establishing switch statement for forking of processes.
case -1:
    perror("fork()");
    exit(EXIT_FAILURE);
    break;
case 0:
    char *const parmList[] = {"usr/bin/sort","output.txt","-o","output.txt",NULL};  //execv call to sort file for names.
    break;
default:
    sleep(1);
    printf("\nChild process has finished.");
}

システムコールでは、名前のような用語を簡単に収集するために、ファイルをアルファベット順に並べ替えようとしています。

Execvシステムコールのコマンドを含むchar * constでこのエラーが発生するので、私は非常に驚いています。この[〜#〜] exact [〜#〜] switchステートメントは、異なるプログラムファイルで機能します。誰かが私に欠けているものを見つけることができますか?ありがとう

10
BologneseBandit

Cでは(C++とは反対に)宣言はステートメントではありません。ラベルは文のみに先行する場合があります。たとえば、ラベルの後にnullステートメントを挿入することができます

case 0:
    ;
    char *const parmList[] = {"usr/bin/sort","output.txt","-o","output.txt",NULL};  //execv call to sort file for names.
    break;

または、中かっこでコードを囲むことができます

case 0:
    {
    char *const parmList[] = {"usr/bin/sort","output.txt","-o","output.txt",NULL};  //execv call to sort file for names.
    break;
    }

最初のケースでは変数のスコープがswitchステートメントであり、2番目のケースでは変数のスコープがラベルの下の内部コードブロックであることを考慮してください。変数には自動保存期間があります。そのため、対応するコードブロックを終了した後は生存しません。

18

ラベルの下に変数を定義する場合、変数のスコープを指定する必要があります(中括弧を使用)。

int processid;
switch(processid = fork())
{                 //establishing switch statement for forking of processes.
    case -1:
        perror("fork()");
        exit(0);
        break;
    case 0:
    {
        char *const parmList[] = {"usr/bin/sort","output.txt","-o","output.txt",NULL};  //execv call to sort file for names.
        break;
    }
    default:
        sleep(1);
        printf("\nChild process has finished.");
}
0
Wayne Chen