错误:在'='标记&之前预期':',',',';','}'或'__attribute__'错误:预期')'在'va'之前

时间:2016-01-21 02:58:27

标签: c

我在GCC终端(centos linux)中编译下面的c和.h代码,因为ATM项目收到了以下错误。请帮忙,因为我是编程新手。

.*?

===============================================

validate_acc.h
#ifndef _VALIDATE_ACC_
#define _VALIDATE_ACC_

struct validate_acc {
int user_acc_try, i = 0;
 int user_has_not_entered_right_acc = 1;
 int retries = 3;
  };

 typedef struct validate_acc Validate_acc;




  #endif

====================错误

validate_acc.c

#include<stdio.h>
 #include "validate_acc.h"

  extern int account_number;

  void (Validate_acc va)
{


va.user_acc_try, va.i = 0;
va.user_has_not_entered_right_acc = 1;
va.retries = 3;



 while(va.retries > 0 && va.user_has_not_entered_right_acc == 1){
               printf("\nPlease enter your account number: ");
               scanf("%d", &va.user_acc_try);

               if(va.user_acc_try != account_number){
                                   printf("You entered the wrong     account      number\n");
                               va.retries--;
                               }
               else{
               va.user_has_not_entered_right_acc = 0;
               }
               }
 }

1 个答案:

答案 0 :(得分:2)

结构类型声明不支持初始值设定项,例如您尝试提供的初始值设定项。此外,结构对象的初始化器表达方式与您尝试的方式完全不同。您的struct声明应具有以下格式:

struct validate_acc {
    int user_acc_try;
    int i;
    int user_has_not_entered_right_acc;
    int retries;
};

声明类型,而不是(本身)任何可以初始化的具有关联存储的对象。这就是为什么你可以为它声明类型别名的原因:

typedef struct validate_acc Validate_acc;

如果要执行该类型对象的初始化,则必须基于每个对象执行此操作,如下所示:

struct validate_acc validate_object = { 0, 0, 1, 3 };

或使用typedef ed别名:

validate_acc validate_object = { 0, 0, 1, 3 };

也许您的想法是为您的结构成员提供默认值,但C没有这样的功能。但是,您可以创建快捷方式初始化宏,例如

#define VALIDATE_ACC_DEFAULTS { 0, 0, 1, 3 }

。然后你可以做

struct validate_acc validate_object = VALIDATE_ACC_DEFAULTS;

在这种情况下,这并没有缩短代码,但它确实使它更清晰。假设您将宏定义放在同一个头中是结构声明,它还提供了一个可以更改默认初始化值的中心位置。