Table of Contents

כתיבת קוד C נייד היא אבן הפינה של הנדסה תוכנה מקצועית, המאפשרת יישומים לעבור אדריכלות חומרה מגוונת, מערכות הפעלה, ומדפי פעולה מינימלית. Portability להפחית את תחזוקה מעל הראש, מרחיב את בסיס המשתמש, ואת קוד הוכחות עתידיות נגד פלטפורמות מתפתחות. מאמר זה מקטין את שיטות הקרב מבחן הטוב ביותר להשגת יכולת הקרב, מעומקים בסטנדרט ועשרות שנים של ניסיון בעולם האמיתי.

הבנת ההבדלים בפלטפורמת

לפני יישום טכניקות זמינות, מפתחים חייבים להכיר בסוגי וריאציות הקיימים בין פלטפורמות.הבדלים אלה משתרעים על ארבע קטגוריות רחבות: התנהגות מסובבת, ממשקי API של מערכת הפעלה, אדריכלות חומרה, ומגבלות משאבים.

המונחים: Variations

(ג) מ- GCC, Clang ו- MSVC לכלים מוטבעים כמו IAR ו-Kil - ליישם את תקן C עם רמות שונות של התאמה.הם עשויים להיות שונים בטיפול שלהם ב-FLT:0 חתימות, פריסת שדות סיביות, מבנה ⁇ , ואת הסיומת המדויקת של FLT:1 או FLT:2 שפות (למשל, GNU, CLTs מוסתרים) יכול גם ליצור LTs.

הבדלי מערכת הפעלה

מערכות דמויות POSIX (לינוקס, macOS, BSD) חולקות API רבים, אך Windows חושפת מערכת שונה לחלוטין של שיחות מערכת. File I/O, קידוד, קישור דינמי, אותות, ובקרת תהליכים לעתים קרובות דורשים איסוף מותני או שכבת אבסטרקטיון.אפילו רגישות לקובץ וחילופי דרך (backslashs לעומת lash קדימה) דורש טיפול.

אדריכלות קשיחה וסוף

מעבדים שונים בגודל המילה (32 סיביות לעומת 64 סיביות), הזמנה ע"י ע"י (ציונית גדולה או מעט endian), דרישות היישור, ותכונות סט הוראות.קוד אשר מניח את ה-FLT:4 הוא 32 סיביות או כי נקודה מתאימה ב-FLT:5 להיכשל בפלטפורמות רבות. Endianness הופך קריטי בעת ביצוע נתונים סידוריים להעברת רשת או קובץ אחסון.

המונחים: constraints

מערכות Embedded או מטרות מוטבעות עמוקות עלולות להיות חסרות מערכת הפעלה, יש ערימה מוגבלת / גדלים, ולספק יישום 6FLT עם מפרט פורמט מוגבל. קוד סלולארי חייב להימנע הנחות על זמינות זיכרון ותמיכה במשרה מלאה.

המונחים: Portable C Code

Rely on Standard C Libraries

הספרייה הסטנדרטית (ISO/IEC 9899) מספקת בסיס לכך שכל מאגד חייב לספק פונקציונליות כמו ההרחבה 7,FLT:8, FLT:9, ו-FLT:10 להתנהג זהה בפלטפורמות. להימנע מקבילות ספציפיות פלטפורמה כגון FLT:11 (POSIX) אלא אם נשמר על ידי קונסולת 9, למבצעים מתמטיים, מעדיפים את ה-FLT מעל ל-:13-:13- ספריות ספציפיות.

שימוש קבוע-Width Integer Types

(ב) , (ב) , ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇

#include <stdint.h>
#include <inttypes.h>
int32_t val = -100;
printf("Value: %" PRId32 "\n", val);

להימנע הנחה על סוגי מימון

(ב) "לא תירא" (ב) כי ב') "וַיֹּאמַר נָא נָא נָא נָא נָא נָתִי הָאָרֶץ" (ב) , אִם נָתַּבְתָּבְתָּבָר אִם הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא

ידה אנדוניזם – Explicitly

כאשר משנים נתונים בינאריים על פני מכונות (network, file, or share memory), תמיד להמיר את הסדר הידוע על ידי te - הזמנה ברשת קונבנציונלית (ראשי תיבות של רב-endian) POSIX פונקציות POSIX של FLT:31, FLT:32, ;FLT:33, FLT:33; LT 34 זמינים באופן נרחב; עבור מערכות לא-POSIX, לספק את המימוש שלך באמצעות LTF:35 ו-Ext.

מערכת הקבצים

נתיב קובץ שונה (ראה FLT:36) על יוניקס, POSIX:37 על Windows) להשתמש מאקרו או פונקציה קטנה של תועלת כי נורמליזציה מסלולים. עבור הפעלת הבמאי, POSIX POSIX POSLT:38 API הוא סטנדרטי; על Windows אתה יכול לעטוף FLT:39 מאחורי אותו ממשק.

מיני-מחדש התנהגות בלתי מוגדרת ובלתי-מוחלטת

הסטנדרט C מארגן פעולות רבות כבלתי מוגדרות או מוגדרות להגדרה של יישום, כולל דוגמאות לחתימה על גדות התוספת, שינוי על ידי יותר מאשר רוחב הסוג, והערכה של התפלגות מזהמים סטטיים כגון FLT:0Cpp ChecksFLT:1 או FLT:2Clang-TidyF3LT כדי לתפוס דפוסים כאלה, וכתוב קוד זה רק תואם.

לקט ספרים עבור Compile-Time Selection

(האוסף המיזוגי הוא חיוני לקוד ספציפי לפלטפורמה, אך השימוש לרעה יכול ליצור בלגן מבולבל ידוע מראש: FLT:41, FLT:42, FLT:42, FLT:43, FLT:44, ו-FLT:44 ו-Madertr מאקרו כמו FLT:45:45 תמיד מתעד כל ענף של PH ולשמור את הסעיפים הקטנים של הפלטפורמה.

#ifdef _WIN32
 #include <windows.h>
 #define SLEEP(ms) Sleep(ms)
#else
 #include <unistd.h>
 #define SLEEP(ms) usleep((ms)*1000)
#endif

שימוש בשכבות אבסטרקטיות עבור מערכת Calls

(ב) ל[[המאה ה-20]], [[1924]], [[1924]]]], [[1924]]]], [[1924]]]]]], [[1924]]]], [[1924]]]]]], [[1924]]]]]]]]]], [[1924]]]]]]]]]], [[1924]]]]]]]], [[1924]]]]]]]]]]]], [[1924]]]]]]]]]], [[1924]]]]]], [[1924]]]], [[1924]]]]]]]]]]]], [[1924]]]]]]]]]], [[1924]]]]]], [[1924]]]]]]]]]], [[1924]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]], [[1924]]]], [[1924]], [[1924]], [[1924]], [[1924]], [[[[1924]]]], [[[[1924]]]], [[[[1924]]]]]], [[[[1924]], [[[[1924]]]]]], [[[[1924]]]]]]]], [[[[1924]]]]]]]]]] [[[[1924]]]]

מבחן על פלטפורמות מרובות מוקדם ולעתים קרובות

אינטגרציה רציפה (CI) צינורות צריך להרכיב ולהפעיל את חבילת הבדיקה על לינוקס, macOS, Windows, וכל מטרה מוטבעת. השתמש ב- cross-compilers ו-Autoators (למשל, QEMU) כדי לתפוס באגים ספציפיים לאדריכלות לפני פריסה.

טכניקות מתקדמות

בניית מערכת סודיות עם CMake או Autotools

מערכות בנייה מודרניות יכולות לזהות תכונות פלטפורמה בזמן מוגדר (CMake's (FLT:53), ומודולים של FLT:54 מייצרים ,FLT:56 כי הקוד שלך יכול לכלול.

// Generated config.h
#define HAVE_STDINT_H 1
#define WORDS_BIGENDIAN 0
#define SIZEOF_LONG 8

האסיפה הוויקאלית והאינסטינקטים

כאשר הביצועים דורשים הוראות ספציפיות פלטפורמה (למשל, SIMD, CPUID), מטביע אותם בקבצים נפרדים ולבחור את הקובץ הנכון במהלך הבנייה. השתמש ב-trinsicsicsicsicsics (כמו FLT:59) מ GCC/Clang/ICC/VS) ולא באסיפה קוליין, כי אינטרינרי הם יותר ניידים על אדריכלות זהה.

מבנה נתונים אל-ign explicitly

⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇

המונחים: handling Compatibility

(ראה:65) ו-[[1924]] ו[[1924]] ו[[1924]]]]]] ו[[1924]]]]]] ו[[1924]]]], [[1924]]]]]]]], [[1924]]]]]], [[1924]]]]]]]], [[1924]]]]]]]]]], [[1924]]]]]]]]]]]], [[1924]]]]]]]]]]]]]]]]]], [[1924]]]]]]]]]]]]]]]], [[1924]]]], [[1924]]]]]]]]]]]]]]]]]]]]]]]], [[1924]]]], [[1924]]]]]]]]]]]]]], [[1924]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]], [[1924]]]]]]]]]], [[1924]], [[1924]]]], [[[[1924]]]]]]]] ו[[1924]], [[[[1924]]]]]]]], [[[[1924]]]], [[[[1924]]]], [[[[1924]]]]]], [[[[1924]]]]]]]] [[[[1924]]]]]]

מלכודות בעולם האמיתי וכיצד להימנע מהם

« « « « ללא נפילה

(ב) ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇

מדרש:72 ,2 ,2 ,2 , ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇

הסטנדרט C אומר רק על תכונת ה-73 (ב) הוא סוג אמיתי המסוגל לייצג את הזמנים.בכמה מערכות משובצות הוא ערך 32 סיביות; על אחרים הוא מטוס בן 64 סיביות שחתום על ⁇ מעולם לא מבצע קידוד על FLT:74 ללא בדיקת התכונות שלו, או שימוש ב-FLT:75 עבור הבדלים.

ניכוי הודעות של ®Do-Safety במערכת Calls

(ב) ,7 , ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇

מסקנה

כתיבת קוד C נייד הוא גם משמעת והשקעה. על ידי דבק קרוב לסטנדרט C, בחירת סוגים קבועים-width, ממשקי מערכת מופשטים, ובדיקה על פני פלטפורמות מרובות, מפתחים יכולים לייצר תוכנה שפועלת באופן אמין בסביבות החל ממחשבים על למיקרו-בקרים.הפרקים המפורטים כאן - בשילוב עם מערכת בנייה מודרנית וניתוח סטטי - בסיס עמיד לפיתוח חוצה פלטפורמות: זיכרון הוא מעבר לכל אורך החיים; למרות שהוא לא זוכר את העיצוב של מטרה; למרות שהוא אינו מתפקד.