首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >嵌套c语言函数

嵌套c语言函数
EN

Stack Overflow用户
提问于 2017-07-03 06:57:06
回答 1查看 178关注 0票数 1
代码语言:javascript
运行
复制
#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 lang入门书。当我阅读开源时,我看到了这个函数。但这是什么功能呢?我以前从未见过这种功能。av_alloc_size(1, 2)*av_mallocz_array有什么关系吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-03 07:02:18

它只是一个宏,扩展到GCC特有的属性(__attribute__((alloc_size()))),进一步“描述”该函数。来自GCC文献

alloc_size alloc_size属性用于告诉编译器函数返回值指向内存,其中大小由一个或两个函数参数指定。GCC利用这些信息来提高__builtin_object_size的正确性。 表示分配大小的函数参数由提供给属性的一个或两个整数参数指定。分配的大小要么是指定的单个函数参数的值,要么是指定的两个函数参数的乘积。参数编号从一个开始。 例如, my_calloc(size_t,size_t) __attribute__((alloc_size(1,2) void* my_realloc( void*,size_t) __attribute__((alloc_size(2) 声明my_calloc返回参数1和参数2的乘积给出的大小的内存,my_realloc返回参数2给定的大小的内存。

因此,简而言之,它通过让编译器知道该函数执行动态内存分配(如标准函数malloc()calloc() ),从而帮助编译器更好地“理解”代码。当然,如果没有这些代码,代码也会工作。

这几行:

代码语言:javascript
运行
复制
#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()展开为零(空字符串)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44879476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档