问题
I have been looking through the forums but I have not found an answer to this question that applies to my situation. I am trying to make a system call to using 'sort' (unix), however, I receive an error saying, "a label can only be part of a statement and a declaration is not a statement." Here is the code causing the error.
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.");
}
In the system call I am trying to sort a file in alphabetical order to simply gather like terms by name.
I am so dumbfounded as the error for this occurs at a char * const of which contains the commands for my execv system call. This EXACT switch statement works on a different program file. Can someone spot what I am missing? Thanks
回答1:
In C (opposite to C++) declarations are not statements. Labels may precede only statements. You can write for example inserting a null statement after the label
case 0:
;
char *const parmList[] = {"usr/bin/sort","output.txt","-o","output.txt",NULL}; //execv call to sort file for names.
break;
Or you can enclose the code in braces
case 0:
{
char *const parmList[] = {"usr/bin/sort","output.txt","-o","output.txt",NULL}; //execv call to sort file for names.
break;
}
Take into account that in the first case the scope of the variable is the switch statement while in the second case the scope of the variable is the inner code block under the label. The variable has automatic storage duration. So it will not be alive after exiting the corresponding code blocks.
回答2:
When define a variable below a label, you shall tell the scope of the variable(using brace).
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.");
}
来源:https://stackoverflow.com/questions/46341364/label-can-only-be-used-as-part-of-a-statement-error