سؤال
وأنا الحصول على الخطأ معلمات أكثر لأقل من الرمز، "يجب أن يكون 1506-221 (S) المعد تعبير ثابت صالح"
FILE *fp[] = {stdout, dump_f};
وهذا مقبول؟ ما هي الطريقة الصحيحة و لتحقيق هذا؟
المحلول
ويشير خطأ على النظام الخاص بك المتغير stdout
هو في الواقع ماكرو #defined
الذي يتسع ليصل إلى استدعاء دالة.
والواقع، والبعض الآخر قد اقترح، هو على الأرجح مجرد أن stdout
وأعلن ان خارجي المتغير الذي لا يعرف في وقت الترجمة وبالتالي قيمة لا يمكن توفيره في مهيئ ثابت.
وبغض النظر عن أي يجب أن يكون الحل هو نفسه - كنت أحاول شيئا مثل:
FILE *fp[2];
void init_fp()
{
fp[0] = stdout;
fp[1] = dump_f;
}
نصائح أخرى
وأكثر من المحتمل، stdout
و / أو dump_f
هي وحدات الماكرو أو (على الأرجح المشكلة) غلوبالس الخارجية.
وإذا كان لدي هذا الرمز:
// external.c
int hello = 1234;
// external.h
extern int hello;
// main.c
#include "external.h"
int world = hello; // error!
وأنت سوف تتلقى خطأ في الخط المشار إليه لأن قيمة hello
غير معروف.
وعلى الأرجح أعلنت stdout
وdump_f
كما غلوبالس extern
، كما يلي:
extern FILE *stdout, *stdin, *stderr, *dump_f;
وتقليديا، معظم أنظمة يونكس يستخدم لتحديد stdout
كشيء مثل (&_iob[1])
، التي تحولت الى تعبير ثابت صحيح. سولاريس، على سبيل المثال، لا تزال تفعل ذلك.
وقبل بضع سنوات، والآن، غيرت C مكتبة GNU تعريفها للstdout
إلى شيء لم يكن، رمز قديمة جدا المستمر التي تستخدم لتهيئة المتغيرات FILE *
إلى أي من الملفات القياسية توقفت مؤشرات إلى ترجمة. ويعاقب على ذلك مستوى C، لذلك ليس هناك فضيلة في الشكوى. عليك ببساطة لقبول أنه لا يمكن تهيئة مؤشرات ملف ثابت إلى واحد من مستوى I / O القنوات وإعادة رمز للالتفاف على المشكلة. (ولكن هو م> لا يزال مصدر ازعاج).
وإذا كان هذا هو عالمي، ثم C لا يدعم تهيئة ذلك مع استدعاء دالة. إذا stdout
هو الماكرو (كما اقترح في البداية) لاستدعاء دالة، فإنك لن تكون قادرا على استخدامها لتهيئة العالمية.