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