在开关盒中将 int 与 int 数组的元素匹配

Matching int with element of int array in switch case

我收到以下错误:

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. 我们可以将计算结果为整数的表达式作为 case 标签吗?

环境详情: 在 ubuntu 终端上使用 gcc 编译程序。

case proc_id[0]:

proc_id[0]不是常数,是变量。 case标签只能用一个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");
}

switch 标签在编译时计算,所以它必须是常量表达式。您不能放置计算结果为任何值的表达式。

如果你想要一个等价的算法,你必须使用if语句