2011-05-25 7 views
7

Co to jest typ danych CLOCKS_PER_SEC zwykle reprezentowany jako? long unsigned int? clock_t? Czy różni się od wdrożenia do wdrożenia?Typ CLOCKS_PER_SEC

Pytam, ponieważ używam CLOCKS_PER_SEC w zwracanej wartości i chcę się upewnić, że używam najbardziej odpowiedniego typu.

Odpowiedz

7

wszystkim, że C standardowe obiecuje że CLOCKS_PER_SEC jest stała ekspresja z typem clock_t które muszą być typu arytmetyczna (może być liczbą całkowitą lub typu pływającego).

(C99 7.23 Data i czas <time.h>)

myślę że clock_t jest zwykle long, ale nie postawić swoje życie, że mam rację.

My zwykle wierny Harbison & Steele (3rd ed) sugeruje odlewania clock_t do double do stosowania w swoich programach więc kod może działać niezależnie od rzeczywistej clock_t typu (18.1 ZEGAR, clock_t, CLOCKS_PER_SEC czasy):

Oto jak funkcja clock może być stosowane do czasu program ANSI C:

#include <time.h> 
clock_t start, finish, duration; 
start = clock(); 
process(); 
finish = clock(); 
printf("process() took %f seconds to execute\n", 
     ((double) (finish - start))/CLOCKS_PER_SEC); 

Uwaga jak obsada wpisać double zezwala na clock_t i CLOCKS_PER_SEC na wartość zmiennopozycyjną lub całkę .

Możesz zastanowić się, czy to zadziała dla twoich celów.

+0

A teraz zauważam, że jest to ta sama rada z podręcznika glibc, o której wspomina Tomalak w swojej odpowiedzi (http://stackoverflow.com/questions/6129029/type-clocks-per-sec/6129078#6129078) –

+0

C99 nie jest istotne. To pytanie dotyczy C++ i nie ma między nimi związku. –

+0

Nie widzę gdzie w standardzie C wymaga 'CLOCKS_PER_SEC' do wyrażenia * stałej *. C99 określa ją jako "wyrażenie typu clock_t", pozornie celowo pomijając termin "stała". Sprawa pojawiła się w innym kontekście: czy 'CLOCKS_PER_SEC' powinien być użyteczny w' # if'. Standard wymaga makr podobnych do obiektów, które kwalifikują się jako wyrażenia stałe liczb całkowitych do użycia w '# if'. Ale AFAIK 'CLOCKS_PER_SEC' nie kwalifikuje się i nie może być użyty w" # if "w ogólnym przypadku. – AnT

3

CLOCKS_PER_SEC to makro, które zwykle rozwija się do literału.

The glibc manual mówi:

W systemie GNU clock_t jest równoważna długości int CLOCKS_PER_SEC jest liczbą całkowitą. Jednak w innych systemach, zarówno clock_t, jak i , typ makra CLOCKS_PER_SEC może być typu integer lub zmiennoprzecinkowy. Przesyłanie wartości czasu procesora o numerw celu podwojenia, jak w przypadku w powyższym przykładzie, zapewnia, że ​​operacje , takie jak drukowanie arytmetyczne i , działają prawidłowo i niezmiennie niezależnie od reprezentowanej reprezentacji .

1

CLOCK_PER_SEC jest rzeczywiście określony przez POSIX jako część nagłówka time.h.

To oznacza, że ​​jest to zegar_t opisany przez sys/types.h.

To z kolei mówi:

time_t i clock_t będzie całkowite lub rzeczywistych pływających typy.

Wszystko, co można założyć w przenośnym kodzie, to typ integralny lub zmiennoprzecinkowy. Jeśli potrzebujesz tylko zadeklarować zmienną do zapisania wartości, zadeklaruj ją jako "clock_t".