在switch case中匹配int与int数组的元素

时间:2015-02-13 15:46:14

标签: c gcc switch-statement

我收到以下错误:

program.c:24:3: error: case label does not reduce to an integer constant
   case proc_id[0]: //child process 1 pid

以下代码中的所有case语句:

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

int proc_id[4];

int main(int argc, char *argv[]){
    int i;

    int proc=1;
    for (i = 0; i < 3; ++i)
    {
        if(proc != 0){
            proc = fork(); 
        }
        if (proc != 0)
        {
            proc_id[i]=proc;
        }
    }

    switch(getpid()){
        case proc_id[0]: //child process 1 pid
            for (i = 0; i < l; ++i)
            {
                alarm(3);
                kill(proc_id[1], SIGUSR1);
            }
            break;

        case proc_id[1]: //child process 2 pid
            for (i = 0; i < l; ++i)
            {
                alarm(6);
                kill(proc_id[2], SIGUSR2);
            }
            break;

        case proc_id[2]: //child process 3 pid
            for (i = 0; i < l; ++i)
            {
                alarm(9);
                kill(proc_id[0], SIGUSR1);
            }
            break;

        case proc_id[3]: //parent pid
            printf("parent\n");
            break;
    }
    return(0);
}

void custom_handler(int signum){
    kill(SIGINT, getppid());
    printf("PID:%d \t Signal Number: %d\n", getpid(), signum);
}

void parent_handler(int signum){
    ++sigcount;
    switch(sigcount){
        case l:
            kill(proc_id[0], SIGTERM);
        break;
        case l+3:
            kill(proc_id[1], SIGTERM);
        break;
        case l+6:
            kill(proc_id[2], SIGTERM);
            kill(proc_id[3], SIGTERM);
        break;
    }
}

void sigterm_handler(int signum){
    exit(0);
}

我有两个问题:

  1. 为什么会发生此错误 和
  2. 我们可以将一个计算结果为整数的表达式作为案例标签吗?
  3. 环境详情: 在ubuntu终端上使用gcc编译的程序。

2 个答案:

答案 0 :(得分:4)

switch标签在编译时进行评估,因此它必须是常量表达式。您不能将表达式计算为任何值。

如果您需要等效算法,则必须使用if语句

答案 1 :(得分:3)

case proc_id[0]:

proc_id[0]不是常数,而是变量。案例标签只能使用const,例如:

case 10:

与其他case语句类似。

如果您有变量,则唯一的选择是使用if-else块。

int pid = getpid();
if ( pid == proc_id[0] )
{
   for (i = 0; i < l; ++i)
   {
      alarm(3);
      kill(proc_id[1], SIGUSR1);
   }
}
else if ( pid == proc_id[1] )
{
   for (i = 0; i < l; ++i)
   {
      alarm(6);
      kill(proc_id[2], SIGUSR2);
   }

}
else if ( pid == proc_id[2] )
{
   for (i = 0; i < l; ++i)
   {
      alarm(9);
      kill(proc_id[0], SIGUSR1);
   }
}
else if ( pid == proc_id[3] )
{
   printf("parent\n");
}
相关问题