لماذا لا يمكن ل GCC العثور على واجهة عشوائية () عند -STD = C99 تم تعيين؟

StackOverflow https://stackoverflow.com/questions/575350

  •  05-09-2019
  •  | 
  •  

سؤال

أنا افعل "#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).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top