2017-02-22 76 views
2

所以,我得到了一个函数,我声明了一个已经填充的结构,并且还想声明一个新的函数。当我在顶部声明新函数时,它的工作原理是,当我在逗号(,)之后的同一行上声明它时,它可以工作,但它不起作用。任何解释?提前致谢。为什么我不能在函数中第二次声明结构?

void CFilter(float avgprofit, int lines) 
{ 
    //client goodclient[MAX_CLIENT]; THIS WOULD COMPILE 
    client client[MAX_CLIENT], goodclient[MAX_CLIENT]; // THIS COMPILES 
    //client goodclient[MAX_CLIENT]; THIS WOULDN'T COMPILE 
    int i, amount = 0; 
    float userprofit; 
    for (i = 0; i <= lines; i++) { 
     userprofit = client[i].loses - client[i].wins; 
     if (userprofit >= avgprofit) { 
      client[i].goodclient = 1; 
     } else { 
      client[i].goodclient = 0; 
     } 
    } 
} 
+0

当你有下一行的'goodclient',你是否从前一行删除它?目前还不清楚。顺便说一句,请避免使用与其类型相同的名称作为变量。充其量:混乱,最糟糕的是:错误。 –

+0

*为什么我不能在函数中第二次声明结构?*因为你不能。它实际上是一个*定义*,它不能被复制。然而,一个重复的*声明(例如函数原型或外部变量)可以 - 只要它们全都相同。 –

+0

用大写字母开始类型的好主意 - 然后可以告诉它们不同于变量 –

回答

5

的问题是,在阵列client的名称隐藏类型client的名称。

client client[MAX_CLIENT]; 
client goodclient[MAX_CLIENT]; 

所以在第二个声明中编译器认为名称client作为数组的名称。

对不同的实体使用相同的名称并不是一个好主意。

使编译器编译声明最简单的方法是重命名该数组。

或者,如果类型client是具有相同名称的结构类型的typedef,那么你可以写例如

client client[MAX_CLIENT]; 
struct client goodclient[MAX_CLIENT]; 

另一种方式就是交换的声明

client goodclient[MAX_CLIENT]; 
client client[MAX_CLIENT]; 
相关问题