2017-07-03 72 views
1
#if AV_GCC_VERSION_AT_LEAST(4,3) 
#define av_alloc_size(...) __attribute__((alloc_size(__VA_ARGS__))) 
#else 
#define av_alloc_size(...) 
#endif 

/** 
* Allocate a memory block for an array with av_mallocz(). 
* 
* The allocated memory will have size `size * nmemb` bytes. 
* 
* @param nmemb Number of elements 
* @param size Size of the single element 
* @return Pointer to the allocated block, or `NULL` if the block cannot 
*   be allocated 
* 
* @see av_mallocz() 
* @see av_malloc_array() 
*/ 

av_alloc_size(1, 2) static inline void *av_mallocz_array(size_t nmemb, 
size_t size) 
{ 
    if (!size || nmemb >= INT_MAX/size) 
     return NULL; 
    return av_mallocz(nmemb * size); 
} 

我是一個C浪底。我在閱讀開源時看到了這個功能。但是它有什麼樣的功能呢?我從來沒有見過這種功能。 av_alloc_size(1, 2)*av_mallocz_array有什麼關係?嵌套的C語言函數

+1

'av_alloc_size'是*預處理宏*。 [一本好的初學者書](http://stackoverflow.com/questions/562303/the-definitive-c-book-guide-and-list)應該談論它們。如果你是初學者,那麼你正在看的代碼可能會爲你提高一點。在像例如項目中的代碼對於初學者,ffmpeg是* not *。 –

+0

謝謝你的解釋 – Saqrag

回答

3

這只是一個擴展到GCC特定屬性(__attribute__((alloc_size())))的宏,該屬性更進一步「描述了」的功能。從GCC documentation

alloc_size

的alloc_size屬性用來告訴編譯器,該函數返回值指向存儲器,其中,所述大小由函數參數的一個或兩個給定。 GCC使用這些信息來提高__builtin_object_size的正確性。

表示分配的大小的函數的參數(一個或多個)由供應到屬性的一個或兩個整型參數指定。分配的大小可以是指定的單個函數參數的值,也可以是指定的兩個函數參數的乘積。參數編號從一開始。

例如,

void* my_calloc(size_t, size_t) __attribute__((alloc_size(1,2))) 
void* my_realloc(void*, size_t) __attribute__((alloc_size(2))) 

聲明由參數1和2的產物給出的尺寸的my_calloc返回存儲器中並且由參數2

給定大小的該my_realloc返回存儲器因此,簡而言之,它可以幫助編譯器更好地「理解」代碼,讓它知道該函數執行動態內存分配,如標準函數malloc()calloc()。代碼當然也可以沒有。

這些行:

#if AV_GCC_VERSION_AT_LEAST(4,3) 
#define av_alloc_size(...) __attribute__((alloc_size(__VA_ARGS__))) 
#else 
#define av_alloc_size(...) 
#endif 

確保擴張只與GCC 4.3或更高版本編譯時發生。在其他所有情況下,第二個#define只是使av_alloc_size()完全展開爲空(空字符串)。

+0

謝謝。根據你的解釋和網上的一些文檔,有兩點我以前不知道:宏和無效*。宏 - >簡單理解複製。 void * - >返回指向任何值的指針。所以在預處理器之後:static inline void * av_mallocz_array(size_t nmemb, size_t size)__attribute __((alloc_size(1,2)))或static inline void * av_mallocz_array(size_t nmemb, size_t size) – Saqrag

0

Here isalloc-size屬性的文檔。

該關鍵字(__attribute__)不是標準C,但是C的擴展,針對每個實施。

+0

感謝您的解釋 – Saqrag