18

私は"#include <stdlib.h>"ソースの上部で行います。

コンパイル例:

/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’
ais@xcalibur:t$ 

-std=c99 をオフにすると、関数 isfinite() が見つかりません。したがって、これとその他の理由で -std=c99 を使用したいと思います。私が見逃しているトリックはありますか?

4

4 に答える 4

15

man srandom関数はC99 の一部ではなく、POSIX の一部であると述べています。

srandom /random 関数を宣言する、_BSD_SOURCEまたは_XOPEN_SOURCE >= 500その他の適切な機能テスト マクロをアクティブにします (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
于 2009-02-22T18:39:16.573 に答える
12

はい、あなたが見逃しているトリックがあります:あなたは-std=gnu99の代わりに使うことができます-std=c99

-std=c99 #define__STRICT_ANSI__これ/usr/include/features.hは、「デフォルトでC標準以外のものを有効にしない」と解釈します(これがないと、少なくとも_SVID_SOURCEとの両方が得られます_BSD_SOURCE)。-std=gnu99一方、は「C99とGNU拡張機能」を意味します(gccのデフォルトは現在-std=gnu89C89に相当するため、新しいC99機能を取得するには何かを指定する必要があります)。

別の方法として、機能テストマクロを有効にすることができます(@litbの回答に記載されています)。/usr/include/stdlib.h私のシステムを見る__USE_SVIDと、、、、__USE_XOPEN_EXTENDEDまたはのいずれかが必要__USE_BSDです。/usr/include/features.hこれらを有効にする機能テストマクロは次のとおりです。

  • _SVID_SOURCE(有効__USE_SVID
  • _BSD_SOURCE(有効__USE_BSD
  • _XOPEN_SOURCE少なくともの値で500(を有効にする__USE_XOPEN_EXTENDED
  • _XOPEN_SOURCE_EXTENDED(また有効にします__USE_XOPEN_EXTENDED
  • _GNU_SOURCE(上記の4つの機能テストマクロを含むすべてを有効にします)

将来の標準からの新しい関数との潜在的な名前の衝突についてあまり心配していない新しいプログラムの場合は、両方-std=gnu99を使用-D_GNU_SOURCEすることをお勧めします。これにより、すべての新しい標準機能とGNU拡張機能を使用できるようになり、ある種のフォールバック(たとえば、autoconfスタイルの機能テスト)と組み合わせると、最も柔軟性が高まります。

参照:

于 2009-07-06T01:46:44.760 に答える
0

Ubuntu 9.10 の CodeBlocks で gcc を使用して乱数を作成しました (コンパイラ オプション: -std=gnu99 -D_GNU_SOURCE)。

これは私が遊んだ私のコードです:

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

これは単なるアイデアであり、もちろん他の方法で実現することもできます ;-) [CodeBlocks をインストールするには:sudo apt-get install build-essentialを使用してからsudo apt-get install codeblocks]

于 2010-01-17T15:44:16.220 に答える
-1

rand() と srand() を使用します。ところで: ヘッダーを 1 つか 2 つ忘れましたか? 少なくとも 2 番目の警告はそう教えてくれます。

math.h をインクルードしてみてください。(数学ライブラリには常に問題があり、実際に -lm で強制的にリンクする必要があったことを思い出しました)。

于 2009-02-22T18:23:57.530 に答える