आप इसके उपयोग पर भी विचार कर सकते हैं memmove
Git 2.14.x (Q3 2017) में देखे गए
देखें प्रतिबद्ध 168e635 (16 जुला 2017), और 1,773,664 प्रतिबद्ध , f331ab9 प्रतिबद्ध , प्रतिबद्ध 5,783,980 से (15 जुला 2017) रेने Scharfe ( rscharfe
) ।
(द्वारा विलय Junio सी Hamano - gitster
- में प्रतिबद्ध 32f9025 , 11 अगस्त 2017)
यह एक सहायक मैक्रोMOVE_ARRAY
का उपयोग करता है जो हमारे लिए तत्वों की निर्दिष्ट संख्या के आधार पर आकार की गणना करता है और NULL
उस संख्या के शून्य होने पर पॉइंटर्स का समर्थन करता है।
रॉ memmove(3)
कॉल के साथ NULL
कंपाइलर (अति-उत्सुकता से) बाद में होने वाले NULL
चेक को ऑप्टिमाइज़ कर सकता है ।
MOVE_ARRAY
सरणी प्रविष्टियों की संभावित अतिव्यापी सीमाओं को स्थानांतरित करने के लिए एक सुरक्षित और सुविधाजनक सहायक जोड़ता है।
यह तत्व आकार को संक्रमित करता है, बाइट में आकार प्राप्त करने के लिए स्वचालित रूप से और सुरक्षित रूप से गुणा करता है, तत्व के आकार की तुलना करके एक बुनियादी प्रकार की सुरक्षा जांच memmove(3)
करता है और इसके विपरीत अगर यह NULL
0 तत्वों को स्थानांतरित करने के लिए पॉइंटर्स का समर्थन करता है ।
#define MOVE_ARRAY(dst, src, n) move_array((dst), (src), (n), sizeof(*(dst)) + \
BUILD_ASSERT_OR_ZERO(sizeof(*(dst)) == sizeof(*(src))))
static inline void move_array(void *dst, const void *src, size_t n, size_t size)
{
if (n)
memmove(dst, src, st_mult(size, n));
}
उदाहरण :
- memmove(dst, src, (n) * sizeof(*dst));
+ MOVE_ARRAY(dst, src, n);
इसका उपयोग करता है मैक्रोBUILD_ASSERT_OR_ZERO
जो एक बिल्ड-टाइम निर्भरता को अभिव्यक्त करता है, एक अभिव्यक्ति के रूप में ( @cond
संकलन-समय की स्थिति के साथ जो सच होना चाहिए)।
यदि स्थिति सत्य नहीं है, या संकलनकर्ता द्वारा मूल्यांकन नहीं किया जा सकता है तो संकलन विफल हो जाएगा।
#define BUILD_ASSERT_OR_ZERO(cond) \
(sizeof(char [1 - 2*!(cond)]) - 1)
उदाहरण:
#define foo_to_char(foo) \
((char *)(foo) \
+ BUILD_ASSERT_OR_ZERO(offsetof(struct foo, string) == 0))