2011-05-25 4 views
7

CLOCKS_PER_SECはどのようなデータ型ですか? long unsigned intclock_t?実装ごとに異なりますか?タイプCLOCKS_PER_SEC

戻り値にCLOCKS_PER_SECを使用していますので、私は尋ねます。私は最も適切なタイプを使用していますか?

答えて

7

そのC標準約束すべてがCLOCKS_PER_SEC算術タイプ(整数または浮動小数点型であってもよい)でなければならないタイプclock_tと定数式であることです。

(C99 7.23日付と時刻<time.h>

私はclock_tは通常longあると思うが、私は私が正しい私の人生を賭けていないでしょう。

:あなたのコードは、実際の clock_tタイプ(18.1 CLOCK、CLOCK_T、CLOCKS_PER_SEC、TIMES)に関係なく働くことができるように

私は通常、信頼できるハービソン&スティール(第3版)は、あなたのプログラムで使用するdoubleclock_tをキャストすることを示唆していますキャストはを入力する方法

#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); 

注:ここで

clock機能が 時にANSI Cプログラムを使用することができる方法です10 は、clock_tCLOCKS_PER_SEC を浮動小数点または の整数にすることができます。

あなたの目的に適しているかどうかを検討することがあります。

+0

これはTomalakが彼の答え(http://stackoverflow.com/questions/6129029/type-of-clocks-per-sec/6129078#6129078)で言及しているglibcマニュアルのアドバイスと同じです。 –

+0

C99は関係ありません。この質問はC++に関するもので、この2つの間には関係がありません。 –

+0

私は、Cの標準のどこで 'CLOCKS_PER_SEC'を*定数*式にする必要があるのか​​わかりません。 C99はそれを "clock_t型の表現"と呼んでおり、見かけ上意図的に "定数"という用語を省略している。問題は別の文脈でポップアップしました: 'CLOCKS_PER_SEC'が'#if'の下で使えるかどうか。標準では、 '#if'の下で使用できる整数定数式としての資格を持つオブジェクトのようなマクロが必要です。しかし、AFAIK 'CLOCKS_PER_SEC'は、一般的な場合には'#if'の下では使用できません。 – AnT

3

CLOCKS_PER_SECはマクロで、通常はリテラルに展開されます。

glibc manualは言う:GNUシステムにおいて

を、clock_t長いINTと CLOCKS_PER_SECが整数値であると同等 あります。 しかし、他のシステムでは、clock_tと の両方のマクロCLOCKS_PER_SEC の型は、整数または 浮動小数点型のいずれかになります。上の例の のように、 プロセッサ時間の値をdoubleにキャストすると、 の演算がの演算が正常に機能し、 の演算が正常に機能していることが常に確認されます。

1

CLOCK_PER_SECは実際にはtime.hヘッダーの一部としてPOSIXによって指定されています。

それはsys/types.hで説明されているclock_tだと言います。

順番に言うこと:

のtime_tとclock_tが整数または 実浮動小数点型でなければなりません。

したがって、ポータブルコードでは、整数型または浮動小数点型であるとみなすことができます。値を格納する変数を宣言するだけであれば、それを "clock_t"として宣言してください。