использование заголовочных файлов в нескольких источниках .c - PullRequest
0 голосов
/ 22 декабря 2018

В моем проекте в CLion у меня есть несколько заголовков.Один из них - constants.h, в который я положил все свои константы.Теперь я хочу использовать этот заголовок в main.c и view.h.view.c - это другой исходный файл, связанный с view.h.Всякий раз, когда я использую его, он выдает ошибку из-за переопределения констант.Я также использовал:

//constants.h
#ifndef PROJECT_CONSTANTS_H
#define PROJECT_CONSTANTS_H
# define pi 3.14159265359
# define degToRad (2.000*pi)/180.000

//GAME GRAPHICS CONSTANTS
const int TANK_RADIUS = 15;
const int CANNON_LENGTH = TANK_RADIUS;
const int BULLET_RADIUS = 4;
const int BULLET_SPAWN_POS = TANK_RADIUS+BULLET_RADIUS;
//const int tank_width = 10;
//const int tank_height = 20;
const int WIDTH = 800;
const int HEIGHT = 600;

//GAME LOGICAL CONSTANTS
const int step = 5;
const double angleStep = 4.5;
const int bulletSpeed = 8;
#define maxBulletPerTank  10
#endif

//main.c includes
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include <SDL.h>
#include <SDL2_gfxPrimitives.h>
#include "structs.h"


#include "view.h"

//view.h
#ifndef PROJECT_VIEW_H
#define PROJECT_VIEW_H

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include <SDL.h>
#include <SDL2_gfxPrimitives.h>
#include "constants.h"


SDL_Renderer* init_windows(int width , int height);

#endif

//view.c

#include "view.h"
SDL_Renderer* init_windows(int width , int height)
{
    SDL_Init(SDL_INIT_VIDEO);
    SDL_Window* window = SDL_CreateWindow("workshop", 100, 120, width, height, SDL_WINDOW_OPENGL);
    SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
    return renderer;
}

В первой части constants.h, но включил ее как в main.c, так и view.h дает мне ошибку.Есть ли способ решить это?Обратите внимание, что если я не включу его в view.h, он не распознает некоторые части, которые используют константы, определенные в constants.h.Мне нужно использовать эти константы в нескольких других .h файлах.

на вершине main.c и view.h У меня есть: #include<constants.h> и у меня #include<view.h> на вершине view.c.view.h также включено в начало main.c

Одна из ошибок:

CMakeFiles\project_name.dir/objects.a(view.c.obj):[address]/constants.h:26: multiple definition of `step':
CMakeFiles\project_name.dir/objects.a(main.c.obj):[address]/constants.h:23: first defined here

Я новичок в стандартном программировании и не знаю, как с этим справиться.

1 Ответ

0 голосов
/ 22 декабря 2018

Проблема в том, что ваш заголовок не определяет константы, он определяет (только для чтения) переменные.Вы получаете ошибку, потому что #include копирует содержимое заголовка в каждый исходный файл, который включает его, поэтому каждый исходный файл пытается определить эти глобальные переменные.

Обычное решение, когда вы хотите, чтобы глобальные переменные состояли только впоместите объявления в заголовочный файл:

// constants.h
extern const int step;
extern const double angleStep;

Фактические определения переменных содержатся в (одном) исходном файле:

// constants.c
#include "constants.h"
const int step = 5;
const double angleStep = 4.5;

Но обратите внимание, что это не константы:

switch (...) {
    case step:  // Error: case label must be a constant
        ...
}

Если вам нужны фактические константы, вы должны вместо этого использовать макросы:

// constants.h
#define STEP 5
#define ANGLE_STEP 4.5

Тогда вам не нужен отдельный файл .c.

Только для целочисленных констант,есть обходной путь, включающий перечисления:

// constants.h
enum { step = 5 };

Это создает фактическую целочисленную константу с именем step;к сожалению, эту технику нельзя использовать с числами с плавающей запятой.

...