שלום,שאלה

Moridin

New member
לא, אתה לא

נסה בעצמך. ל-printf אפשר לעשות כאילו-Override כמו שעשית כאן כי היא נכנסת ל-exe רק בשלב הלינקוג'. הקומפיילר לא הולך לחפש את ה-printf של הספריה הסטנדרטית באיזשהו קובץ obj בכלל, כי הוא כבר מכיר את הפונקציה - היא ממומשת במלואה בתוך הקוד. ב-header יש רק הצהרה עליה, מה שלא סותר מימוש שלה בתוך הקוד.
 

Moridin

New member
בעייתי ביותר עד בלתי אפשרי

לדבר על override לפונקציות גלובליות ב-C/C++. השפות פשוט אינן כוללות מנגנון כזה. ניתן לכתוב את הפונקציה מחדש, וגם זה רק במקרה והקומפיילר "לא מכיר" את המימוש של הפונקציה... בכל מקרה, לכתוב פונקציה שכבר קיימת זה רעיון רע, אפילו אם זה מתקמפל. פתח לבעיות ולאי-הבנות.
 

vinney

Well-known member
זה נכון

זה פתח לקוד זדוני. אבל עובדה שזה מתקמפל, למרות שהלינקר (בעיניי) היה אמור לצעוק על כפילות בין printf שאני כתבתי לprintf בספריה הסטנדרטית (שזה בסה"כ LIB שהOBJ שלי מתלנקג' איתו), וזה לא קורה. זה פתח די גדול לקוד זדוני, אם חושבים על זה.
 
דוגמא לשימוש - callback

אתן לך דוגמא מתי זה שימושי נניח אתה משתמש בספרייה שבה אתה צריך לספק פונקציה לביצוע פעולות משלך. הספרייה תקרא לפונקציה שלך כדי לאפשר לך להוסיף קוד. הספריה מגדירה שהפונקציה שלך חייבת להיות מטיפוס מסויים נניח:
typeded void (*callback_function)(int, int, int);​
הספריה תקרא לפונקציה שלך עם שלושה פרמטרים. עכשיו נניח שבמימוש שלך אתה לא צריך את הפרמטר השלישי אז:
void my_implementation(int param1, int param2, int) { // your code here }​
זה בהחלט חוקי לתת שם לפרמטר השלישי ולא להשתמש בו אבל הקומפיילר יכול להזהיר אותך. בשפת C, להבדיל מ-++C אין אפשרות לא לתת שפ וכדי להיפטר מאזהרות קומפיילר על משתנה שאיננו בשימוש היו משתמשים בטריק הבא (בין היתר)
#define UNUSED_ARG(a) ((void)(a)) void my_implementation(int param1, int param2, int param3) { UNUSED_ARG(param3); // .... }​
כשם שהורדת שם משתנה שימושית עבור פונקציות callback כך היא שימושית במימוש של פונקציות ממחלקת בסיס. גם כאן המימוש שלך לא זקוק לפרמטר הנוסף ולכן אפשר להשמיט את השם של הארגומנט
 

andav

New member
תודה,אך אפשר לומר שקצת איבדתי

פה את הידיים והרגליים
. אני אניח לעניין זה כרגע. תודה שוב.
 
למעלה