حلقة صفيف مخصص بشكل ثابت ، خارج وضع C99؟
سؤال
هذا في إشارة إلى حل تم نشره على: حلق صفيف بحجم ثابت دون تحديد حجمه في ج
هذا هو رمز العينة الخاص بي:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
static const char *foo[] = {
"this is a test",
"hello world",
"goodbye world",
"123",
NULL
};
for (char *it = foo[0]; it != NULL; it++) {
printf ("str %s\n", it);
}
return 0;
}
محاولة تجميع هذا يعطي:
gcc -o vararray vararray.c
vararray.c: In function ‘main’:
vararray.c:14: warning: initialization discards qualifiers from pointer target type
vararray.c:14: error: ‘for’ loop initial declaration used outside C99 mode
المحلول
إلى جانب التهيئة في الحلقة ، فأنت تتزايد في المكان الخطأ. أعتقد أن هذا ما تعنيه (لاحظ أنني لست بالضبط C Guru):
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
static const char *foo[] = {
"this is a test",
"hello world",
"goodbye world",
"123",
NULL
};
const char **it;
for (it=foo; *it != NULL; it++) {
printf ("str %s\n", *it);
}
return 0;
}
نصائح أخرى
متغير حلقة الخاص بك
it
من النوعchar*
, ، محتويات الصفيف من النوعconst char*
. إذا تغيرتit
ليكون أيضاconst char*
يجب أن يختفي التحذير.أنت تعلن
it
داخل البيان ، هذا غير مسموح به في C قبل C99. يعلنit
في بدايةmain()
في حين أن.
بدلاً من ذلك يمكنك إضافة-std=c99
أو-std=gnu99
إلى أعلام GCC الخاصة بك لتمكين ميزات لغة C99.
يستخدم -std=c99
الخيار عند تجميع الكود الخاص بك من أجل استخدام C99
الميزات.
يتغيرون it
إلى const char*
اكتب (لإزالة التحذيرات)
قبل C99 ، أعلن أن مؤشر الشخصية في الحلقة غير قياسي.
أنت بحاجة إلى شيئين للحصول على هذا التجميع بدون تحذيرات: أعلن عن التكرار const char* it
, ، وافعل ذلك في بداية الوظيفة وليس في بيان الحلقة.