سؤال

وأنا الحصول على الخطأ معلمات أكثر لأقل من الرمز، "يجب أن يكون 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 هو الماكرو (كما اقترح في البداية) لاستدعاء دالة، فإنك لن تكون قادرا على استخدامها لتهيئة العالمية.

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