在开关盒中将 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);
}
我有两个问题:
- 为什么会出现这个错误
- 我们可以将计算结果为整数的表达式作为 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
语句
我收到以下错误:
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);
}
我有两个问题:
- 为什么会出现这个错误
- 我们可以将计算结果为整数的表达式作为 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
语句