试着学习C所以我做了这个简短的程序来尝试和模仿类。这个代码有什么我不应该用C或任何方式我可以改进它像最佳实践或任何东西?
structs.h
struct weapon {
char name[30];
int damage;
int durability;
};
struct player {
int health;
int armor_level;
int currency;
struct weapon player_weap;
};
main.c中
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "structs.h"
struct player new_player();
void main() {
struct player user = new_player();
printf("The players health is %d.\n", user.health);
printf("The players armor is %d.\n", user.armor_level);
printf("The players currency is %d.\n", user.currency);
printf("The players weapon is the %s.\n", user.player_weap.name);
printf("The players weapon does %d damage and has %d durability.\n", user.player_weap.damage, user.player_weap.durability);
}
struct player new_player() {
struct player new_player;
new_player.health = 100;
new_player.armor_level = 0;
new_player.currency = 0;
strcpy(new_player.player_weap.name, "Starter Sword");
new_player.player_weap.damage = 1;
new_player.player_weap.durability = 100;
return new_player;
}
那么有几点: - 如果结构不是太大,你可以这样做。这是完全正确的。
malloc
在计算上比从函数返回时复制变量更昂贵。如果结构尺寸更大,那么你应该malloc
它。这样你就不会在堆栈中使用大量内存。
您应该尝试考虑使代码可重用。您可以保留一个打印结构的功能。类似的东西(与获得struct实例的单独函数相同的原因)。
void printPlayer(struct player p){
...
}
这样,无论何时你试图打印它 - 你只需要调用它。这样可以避免重复多次重复打印相同的代码。
另一件事是,你可以typedef
struct player
更可读的东西。在这种情况下,player
本身是可读的,但在某些情况下typedef
有帮助。但那就是debatable。
main()
也应该是(OS期望整数回来)
int main(void){
..
return 0;
}
您可以将函数printPlayer
或new_player
的声明移动到标题本身。这更有意义。
另一件事是使用合适的名字。 structs.h
不是头文件的好名字。在这个项目中,将不会有任何struct
头文件?保留名称Player.h
或Game.h
。这更具可读性。
使用标题保护
#ifndef PLAYER_H
#define PLAYER_H
struct weapon {
char name[30];
int damage;
int durability;
};
struct player {
int health;
int armor_level;
int currency;
struct weapon player_weap;
};
#endif
这只是一个偏好问题,但是当我使用结构类似的东西时,我总是做typedef
给自己一个新的数据类型。它使编写代码更容易,并帮助我更好地理解它发生了什么。
typedef struct {
char name[30];
int damage;
int durability;
} Weapon;
typedef struct {
int health;
int armor_level;
int currency;
Weapon player_weap;
} Player;
所以不要声明像这样的函数
struct player new_player();
你会这样做的
Player new_player();
它模拟了更好地使用类的过程,IMO。此外,谁告诉你使用void main()
是可怕的失去联系。除非您正在编写内核或微控制器或其他东西,否则不要使用它。几乎每个编程环境都是int main(void)
。如果您的程序已成功运行,请确保return 0;
。