2009-02-22 15 views
17

私は"#include <stdlib.h>"を送信元の上部に表示します。-std = c99が設定されているときにgccがrandom()インターフェイスを見つけられないのはなぜですか?

例のコンパイル:私は-std = C99をオフにすると

/usr/bin/colorgcc -std=c99 -fgnu89-inline -g -Wall -I/usr/include -I./ -I../ -I../../ -I../../../ -I../../../../ -O3 -o f8 f8.c 
In file included from f8.c:7: 
ctype-cmp.c: In function ‘randomized’: 
ctype-cmp.c:48: warning: implicit declaration of function ‘random’ 
ctype-cmp.c: In function ‘main’: 
ctype-cmp.c:153: warning: implicit declaration of function ‘srandom’ 
[email protected]:t$ 

、関数isFiniteの方が()が見つかりません。ですから、私はこのやその他の理由で-std = c99を使いたいと思っています。私は行方不明のトリックはありますか?

答えて

14

man srandomは、ではなく、の部分がPOSIXの一部であると言います。

_BSD_SOURCEまたは_XOPEN_SOURCE >= 500、またはsrandom/random関数(man feature_test_macrosおよびman srandomを参照)を宣言するその他の適切な機能テストマクロを有効にします。

これは良いチャンスですが、上のマンページを読むことで暗黙的に定義/定義されていないマクロを把握する必要があります。

/usr/bin/colorgcc -std=c99 -D_XOPEN_SOURCE=600 -fgnu89-inline -g -Wall 
    -I/usr/include -I./ -I../ -I../../ -I../../../ -I../../../../ -O3 -o f8 f8.c 
-1

私はrand()とsrand()を使用します。ところで、ヘッダーか2つを忘れましたか?少なくとも2番目の警告は私にそう言います。

math.hを含めるようにしてください。 (私たちはいつも数学図書館に問題があり、実際には-lmとリンクさせなければならなかったことを思い出しました)。

+0

正しいヘッダーのが含まれていたので、私がダウンして、この応答に投票しなければならなかった(両方ともstdlibと数学)。トリックはマクロを定義することでした。レスポンスありがとう! – SetJmp

+0

私はあなたがmath.hを言及しているのを見たことがありません – dirkgently

+0

合計Cノブとして、私は少なくとも "サンド"の言葉に感謝します。ありがとう! – jocull

12

はい、あなたが不足しているトリックがあります:あなたは-std=gnu99の代わり-std=c99を使用することができます。 「デフォルトではCの標準外の何かを有効にしない」と解釈し/usr/include/features.h__STRICT_ANSI__

-std=c99#define、(それなしでは、あなたは、少なくとも_SVID_SOURCE_BSD_SOURCEの両方を取得します)。一方、-std=gnu99は "C99 plus GNU extensions"を意味します(gccのデフォルトは現在-std=gnu89です。新しいC99機能を得るために何かを指定する必要があったのです)。

(@ litbの答えにあるように)機能テストマクロを有効にすることもできます。私のシステムで/usr/include/stdlib.hを見ると、__USE_SVID,__USE_XOPEN_EXTENDED、または__USE_BSDのいずれかとなります。少なくとも500__USE_XOPEN_EXTENDEDを可能にします) の値を持つ

  • _SVID_SOURCE__USE_SVIDを可能にします)
  • _BSD_SOURCE__USE_BSDを可能にします)
  • _XOPEN_SOURCE/usr/include/features.hはこれらを可能にする機能検査マクロであることを私に伝えます
  • _XOPEN_SOURCE_EXTENDED__USE_XOPEN_EXTENDEDも可能)
  • _GNU_SOURCEあなたは将来の規格からの新機能との潜在的な名前の衝突についてあまり心配しない新しいプログラムでは

(上記の4つの機能検査マクロを含むすべてのものを、可能)、-std=gnu99-D_GNU_SOURCEの両方を使用することは良いアイデアです。これにより、すべての新しい標準機能とGNU拡張機能を使用することができます。これには、何らかのフォールバック(例えば、autoconfスタイルの機能テスト)が組み合わされています。

参考文献:

0

私は(コンパイラオプション付き:-std=gnu99 -D_GNU_SOURCE)のUbuntu 9.10の下のコードブロック内のgccを使用して乱数を作成しましたので、これは私の仕事:

これは私が演奏したコードです:

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
#include <time.h> 
enum computer {keyboard, CPU, screen, printer}; 
int main(void) 
{ 
    enum computer comp; 
    time_t casovac; 
    comp = CPU; 
    srand(&casovac); 
    printf("%d", rand()); 
    return 0; 
} 

これはもちろん、あなたが;-) [コードブロックをインストールするために使用:sudo apt-get install build-essential、その後sudo apt-get install codeblocks]他の方法でそれを達成することができ、唯一のアイデアだった

関連する問題