لماذا لا يمكن ل GCC العثور على واجهة عشوائية () عند -STD = C99 تم تعيين؟
سؤال
أنا افعل "#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$
عندما أطفئ = C99، لا يمكن العثور على وظيفة isfinite (). لذلك أريد استخدام -StD = C99 لهذا وأسباب أخرى. هل هناك بعض خدعة أفتقدها؟
المحلول
man srandom
يقول أن الوظيفة هي ليس جزء من C99 ولكن جزء من posix.
تفعيل _BSD_SOURCE
أو _XOPEN_SOURCE >= 500
أو أي ماكرو اختبار ميزة مناسبة أخرى يعلن عن وظيفة سراندوم / عشوائية (انظر man feature_test_macros
و man srandom
).
هذا واحد لديه فرص جيدة، ولكن تحتاج إلى معرفة وحدات الماكرو المحددة / غير المحددة ضمنيا وبالتالي من خلال قراءة manpages أعلاه.
/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
نصائح أخرى
نعم، هناك خدعة تفتقدها: يمكنك استخدام -std=gnu99
بدلا من -std=c99
.
-std=c99
#define
س __STRICT_ANSI__
, ، أي /usr/include/features.h
تفسر بأنها "لا تمكن أي شيء خارج قياسي C افتراضيا" (بدونها، تحصل على حد سواء على الأقل _SVID_SOURCE
و _BSD_SOURCE
). -std=gnu99
, ، من ناحية أخرى، يعني "C99 بالإضافة إلى ملحقات جنو" (الافتراضي الخليجي حاليا -std=gnu89
, ، ما يعادل C89، وهذا هو السبب في أنك بحاجة لتحديد شيء للحصول على ميزات 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
(تمكن كل شيء، بما في ذلك وحدات ماكرو اختبار الميزة الأربعة أعلاه)
بالنسبة لبرامج جديدة حيث لا تشعر بالقلق للغاية بشأن تصادم الاسم المحتمل مع وظائف جديدة من المعايير المستقبلية، باستخدام كليهما -std=gnu99
و -D_GNU_SOURCE
فكرة جيدة. يتيح لك استخدام جميع الميزات القياسية الجديدة وملحقات جنو، والتي تقترن نوعا ما من التراجع (على سبيل المثال، autoconf
اختبارات ميزة -Style) يعطي المرونة الأكثر.
مراجع:
لقد قمت بإنشاء أرقام عشوائية باستخدام دول مجلس التعاون الخليجي في CodeBlocks ضمن Ubuntu 9.10 (مع خيارات التحويل البرمجي: -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
]
أنا استخدم RAND () و SRAND (). راجع للشغل: هل نسيت رأس أو اثنين؟ على الأقل تحذير الثاني يخبرني بذلك.
حاول بما في ذلك الرياضيات (فقط تذكرنا دائما مشاكل مع مكتبة الرياضيات واضطررت إلى فرض ربطها بالفعل مع -lm).