正在寻找改进此代码的方法,或者有什么我不应该做的[关闭]

问题描述 投票:-3回答:2

试着学习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;

}
c
2个回答
3
投票

那么有几点: - 如果结构不是太大,你可以这样做。这是完全正确的。

malloc在计算上比从函数返回时复制变量更昂贵。如果结构尺寸更大,那么你应该malloc它。这样你就不会在堆栈中使用大量内存。

您应该尝试考虑使代码可重用。您可以保留一个打印结构的功能。类似的东西(与获得struct实例的单独函数相同的原因)。

void printPlayer(struct player p){
  ...
}

这样,无论何时你试图打印它 - 你只需要调用它。这样可以避免重复多次重复打印相同的代码。

另一件事是,你可以typedef struct player更可读的东西。在这种情况下,player本身是可读的,但在某些情况下typedef有帮助。但那就是debatable

main()也应该是(OS期望整数回来)

int main(void){
  ..
  return 0;
}

您可以将函数printPlayernew_player的声明移动到标题本身。这更有意义。

另一件事是使用合适的名字。 structs.h不是头文件的好名字。在这个项目中,将不会有任何struct头文件?保留名称Player.hGame.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

2
投票

这只是一个偏好问题,但是当我使用结构类似的东西时,我总是做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;

© www.soinside.com 2019 - 2024. All rights reserved.