inicjalizacja stałej inną stałą

0

Witam

Mam problem, ponieważ próbuję zrobić coś takiego:

const int FPS = 60;
const float DT = 1.0 / FPS;

Ale przy próbie kompilacji dostaje błąd:

.../main.c|4|error: initializer element is not constant|

Oczywiście można to zastąpić po prostu:

const int FPS = 60;
const float DT = 1.0 / 60;

Ale takie rozwiązanie jest nieeleganckie. Proszę o pomoc jak można to zrobić (z pominięciem zdefiniowania makra FPS).

Pozdrawiam

0

W C posługuj się #define do deklaracji stałych.

1

Problem wynika z terminologii C (większość słów po polsku żeby nie komplikować próbami tłumaczenia).

W C słowo constant odnosi się do literałów (tzn. np. 12 albo 'x').
Z tego powodu, jakkolwiek dziwne by to się nie wydawało, const-qualified obiekty (Twoje FPS, DT) nie są constant w terminologii C.
Czyli const int FPS = 60; nie jest constant.

Dlaczego tak (a przynajmniej z tego co pamiętam): constant można rozumieć jako 'coś o wartości znanej w trakcie kompilacji'/'coś czego wartość nigdy się nie zmienia'. Z drugiej strony, rozważ taki program:

#include <stdio.h>

void test(const int x) {
    printf("%d\n", x);
}

int main() {
    test(1);
    test(2);
    return 0;
}

Parametr x jest const-qualified, ale nijak nie jest stały podczas działania programu.

tl;dr -> to co napisał @_13th_Dragon powyżej.

0

Ale używając #define do definiowania stałych nie daje nam tej korzyści jaką jest kontrola typów przy używania const. Wydaje mi się być to trochę rozwiązaniem nieeleganckim i na około. Nie ma żadnego sposobu aby inicjalizować jedną stałą inną stałą (przecież FPS jest bardzo dobrze znane w czasie kompilacji i nie widzę problemu, by było użyte do zainicjalizowania innej stałej).

1

C - #define
C++ - const
do wyboru, do koloru.

1
	const int FPS = 60;
	const float DT = 1.0 / FPS;

To się skompiluje jako C++, ale nie jako C.

Przykro mi bardzo.
Użyj #define.

0

Ok, dzięki za odpowiedź :) Dobrze wiedzieć, że c++ to przyjmie :) A dla programu napisanego w C użyję po prostu:

const float FPS = 60.0f;
const float DT = 1.0f / 60.0f;
0
#define FPS 60.0f

nie potrzebujesz tutaj "kontroli typów". sam literał 60.0f jest jednoznacznie typu float. nie da się tego przypisać do inta czy char*.

0

W sumie racja. Jeszcze raz dzięki

1 użytkowników online, w tym zalogowanych: 0, gości: 1