2017-09-21 20 views
3

我一直在寻找论坛,但我还没有找到适用于我的情况的这个问题的答案。我正在尝试使用'sort'(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."); 
} 

在系统调用中,我试图按字母顺序对文件进行排序,以便按名称简单地收集文件。

我很傻,因为这个错误发生在char * const包含我的execv系统调用的命令。这个EXACT switch语句适用于不同的程序文件。有人可以发现我缺少的东西吗? 谢谢

+2

'sort'是一个正常的程序,而不是系统调用。无论如何,声明是一个没有阻塞的switch语句都是一个非常糟糕的主意。一本好的C书应该明确**为什么**。旁注:你使数组为const的任何原因,但不是它们指向什么?您不得更改字符串文字。你在哪里执行该程序?提供[mcve]。 – Olaf

+0

问题的哪个部分是Unix特有的?如果没有,请不要使用无关标签发送垃圾邮件。 – Gerhardh

+0

什么让你对错误信息感到沮丧?它写得很清楚。 –

回答

5

在C(与C++相反)声明不是语句。标签可能只在语句之前。你可以写例如标签

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; 
    } 

考虑到的是,在第一种情况中变量的作用域是开关语句,而在第二种情况下,变量的范围是标签下的内部代码块。该变量具有自动存储持续时间。所以退出相应的代码块后它不会活着。

+0

所以这只是一个在我的结肠后添加另一个分号的例子。你能向我解释为什么这是弗拉德? – BologneseBandit

+0

@BologneseBandit分号引入一个空语句。 –

+0

糟糕。我错了,这是正确的。每天学些新东西。有一个upvote! – Bathsheba

0

当在一个标签下面定义一个变量时,你应该告诉变量的范围(使用大括号)。

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."); 
}