.\" -*- coding: UTF-8 -*- '\" t .\" Copyright 1990-1991, The Regents of the University of California. .\" Copyright, the authors of the Linux man-pages project .\" .\" SPDX-License-Identifier: BSD-4-Clause-UC .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH stdarg 3 "17 مايو 2025" "صفحات دليل لينكس 6.18" .SH الاسم stdarg, va_start, va_arg, va_end, va_copy \- قوائم المعاملات المتغيرة .SH المكتبة مكتبة سي المعيارية (\fIlibc\fP،\ \fI\-lc\fP) .SH موجز .nf \fB#include \fP .P \fBvoid va_start(va_list \fP\fIap\fP\fB, \fP\fIlast\fP\fB);\fP \fItype\fP\fB va_arg(va_list \fP\fIap\fP\fB, \fP\fItype\fP\fB);\fP \fBvoid va_end(va_list \fP\fIap\fP\fB);\fP \fBvoid va_copy(va_list \fP\fIdest\fP\fB, va_list \fP\fIsrc\fP\fB);\fP .fi .SH الوصف قد تُستدعى دالة بعدد متغير من المعاملات من أنواع متغيرة. يُصرح ملف التضمين \fI\fP بنوع \fIva_list\fP ويُعرف ثلاث وحدات ماكرو للتنقل عبر قائمة من المعاملات التي لا يُعرف عددها وأنواعها للدالة المُستدعاة. .P يجب على الدالة المُستدعاة أن تُصرح بكائن من النوع \fIva_list\fP الذي تستخدمه وحدات الماكرو \fBva_start\fP() و \fBva_arg\fP() و \fBva_end\fP(). .SS va_start() وحدة الماكرو \fBva_start\fP() تُهيئ \fIap\fP للاستخدام اللاحق بواسطة \fBva_arg\fP() و \fBva_end\fP()، ويجب استدعاؤها أولاً. .P المعامل \fIlast\fP هو اسم آخر معامل قبل قائمة المعاملات المتغيرة، أي آخر معامل تعرف الدالة المُستدعية نوعه. .P لأن عنوان هذا المعامل قد يُستخدم في وحدة الماكرو \fBva_start\fP()، فلا ينبغي التصريح عنه كمتغير سجل، أو كنوع دالة أو مصفوفة. .SS va_arg() وحدة الماكرو \fBva_arg\fP() تتوسع إلى تعبير له نوع وقيمة المعامل التالي في الاستدعاء. المعامل \fIap\fP هو \fIva_list\fP \fIap\fP المُهيأ بواسطة \fBva_start\fP(). كل استدعاء لـ \fBva_arg\fP() يُعدل \fIap\fP بحيث يُرجع الاستدعاء التالي المعامل التالي. المعامل \fItype\fP هو اسم نوع مُحدد بحيث يمكن الحصول على نوع مؤشر لكائن له النوع المُحدد ببساطة بإضافة * إلى \fItype\fP. .P الاستخدام الأول لوحدة الماكرو \fBva_arg\fP() بعد استخدام وحدة الماكرو \fBva_start\fP() يُرجع المعامل بعد \fIlast\fP. الاستدعاءات المتتالية تُرجع قيم المعاملات المتبقية. .P إذا لم يكن هناك معامل تالٍ، أو إذا كان \fItype\fP غير متوافق مع نوع المعامل التالي الفعلي (كما يُرفع وفقًا لترقيات المعاملات المبدئية)، فستحدث أخطاء عشوائية. .P إذا مُرر \fIap\fP إلى دالة تستخدم \fBva_arg(\fP\fIap\fP\fB,\fP\fItype\fP\fB),\fP فإن قيمة \fIap\fP تكون غير مُعرفة بعد عودة تلك الدالة. .SS va_end() يجب أن يُقابل كل استدعاء لـ \fBva_start\fP() استدعاء مقابل لـ \fBva_end\fP() في نفس الدالة. بعد الاستدعاء \fBva_end(\fP\fIap\fP\fB)\fP يكون المتغير \fIap\fP غير مُعرف. عمليات اجتياز متعددة للقائمة، كل منها محصور بين \fBva_start\fP() و \fBva_end\fP()، ممكنة. قد تكون \fBva_end\fP() وحدة ماكرو أو دالة. .SS va_copy() وحدة الماكرو \fBva_copy\fP() تنسخ قائمة المعاملات المتغيرة (المُهيأة سابقًا) \fIsrc\fP إلى \fIdest\fP. السلوك كما لو أن \fBva_start\fP() طُبقت على \fIdest\fP بنفس المعامل \fIlast\fP، متبوعة بنفس عدد استدعاءات \fBva_arg\fP() التي استُخدمت للوصول إلى الحالة الحالية لـ \fIsrc\fP. .P .\" Proposal from clive@demon.net, 1997-02-28 تطبيق واضح سيجعل \fIva_list\fP مؤشرًا إلى إطار المكدس للدالة المتغيرة. في مثل هذا الإعداد (الأكثر شيوعًا بفارق كبير) لا يبدو هناك ما يمنع الإسناد .P .in +4n .EX va_list aq = ap; .EE .in .P لسوء الحظ، هناك أيضًا أنظمة تجعلها مصفوفة من المؤشرات (بطول 1)، وهناك يحتاج المرء .P .in +4n .EX va_list aq; *aq = *ap; .EE .in .P أخيرًا، على الأنظمة التي تُمرر فيها المعاملات في المسجلات، قد يكون من الضروري لـ \fBva_start\fP() تخصيص ذاكرة، وتخزين المعاملات هناك، وأيضًا إشارة إلى أي معامل هو التالي، بحيث يمكن لـ \fBva_arg\fP() التنقل عبر القائمة. الآن يمكن لـ \fBva_end\fP() تحرير الذاكرة المخصصة مرة أخرى. لاستيعاب هذا الموقف، يضيف C99 كلية \fBva_copy\fP()، بحيث يمكن استبدال التعيين أعلاه بـ .P .in +4n .EX va_list aq; va_copy(aq, ap); \&... va_end(aq); .EE .in .P يجب أن يُقابل كل استدعاء لـ \fBva_copy\fP() باستدعاء مقابل لـ \fBva_end\fP() في نفس الدالة. بعض الأنظمة التي لا توفر \fBva_copy\fP() لديها \fB__va_copy\fP بدلاً من ذلك، لأن هذا هو الاسم المستخدم في الاقتراح المسود. .SH السمات للاطلاع على شرح للمصطلحات المستخدمة في هذا القسم، انظر \fBattributes\fP(7). .TS allbox; lbx lb lb l l l. الواجهة السمة القيمة T{ .na .nh \fBva_start\fP(), \fBva_end\fP(), \fBva_copy\fP() T} سلامة الخيوط MT\-Safe T{ .na .nh \fBva_arg\fP() T} سلامة الخيوط MT\-Safe race:ap .TE .SH المعايير C11, POSIX.1\-2008. .SH التاريخ .TP \fBva_start\fP() .TQ \fBva_arg\fP() .TQ \fBva_end\fP() C89, POSIX.1\-2001. .TP \fBva_copy\fP() C99، POSIX.1\-2001. .SH تحذيرات على عكس الكليات التاريخية \fBvarargs\fP، لا تسمح كليات \fBstdarg\fP للمبرمجين بترميز دالة بدون معاملات ثابتة. تُولد هذه المشكلة عملًا بشكل رئيسي عند تحويل كود \fBvarargs\fP إلى كود \fBstdarg\fP، ولكنها تُنشئ أيضًا صعوبات للدوال المتغيرة التي ترغب في تمرير جميع معاملاتها إلى دالة تأخذ معامل \fIva_list\fP، مثل \fBvfprintf\fP(3). .SH أمثلة تأخذ الدالة \fIfoo\fP سلسلة محارف من حروف التنسيق وتطبع المعامل المرتبط بكل حرف تنسيق بناءً على النوع. .P .EX #include #include \& void foo(char *fmt, ...) /* \[aq]...\[aq] is C syntax for a variadic function */ \& { va_list ap; int d; char c; char *s; \& va_start(ap, fmt); while (*fmt) switch (*fmt++) { case \[aq]s\[aq]: /* string */ s = va_arg(ap, char *); printf("string %s\[rs]n", s); break; case \[aq]d\[aq]: /* int */ d = va_arg(ap, int); printf("int %d\[rs]n", d); break; case \[aq]c\[aq]: /* char */ /* need a cast here since va_arg only takes fully promoted types */ c = (char) va_arg(ap, int); printf("char %c\[rs]n", c); break; } va_end(ap); } .EE .SH "انظر أيضًا" \fBvprintf\fP(3), \fBvscanf\fP(3), \fBvsyslog\fP(3) .PP .SH ترجمة تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي . .PP هذه الترجمة هي وثيقة مجانية؛ راجع .UR https://www.gnu.org/licenses/gpl-3.0.html رخصة جنو العامة الإصدار 3 .UE أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات. .PP إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: .MT kde-l10n-ar@kde.org .ME .