gatomic.c版的GLib中,有几个函数声明如下:

gboolean
(g_atomic_int_compare_and_exchange_full) (gint *atomic,
                                          gint  oldval,
                                          gint  newval,
                                          gint *preval)
{
  return g_atomic_int_compare_and_exchange_full (atomic, oldval, newval, preval);
}

有人能解释一下这个代码到底是做什么的吗?我对这里的几件事感到困惑:

  1. 函数名称g_atomic_int_compare_and_exchange_full位于 圆括号.这有什么意义呢?

  2. 函数体显然只包含对函数本身的调用,因此这将永远运行并导致堆栈 溢出(双关语).

我完全不能理解这个函数声明.这到底是怎么回事?

推荐答案

  1. 函数名称g_ATOM_INT_COMPARE_AND_EXCHANGE_FULL位于括号中.这有什么意义呢?

将函数名放在方括号中可避免任何宏展开,以防有类似宏的函数具有相同的名称.

这意味着,g_atomic_int_compare_and_exchange_full(...)人将使用宏,而(g_atomic_int_compare_and_exchange_full)(...)人将使用函数.

为什么要用这个? 不能将宏赋给函数指针.在这种情况下,您可以提供您看到的定义,然后您可以使用

ptr = (g_atomic_int_compare_and_exchange_full);

以使用函数而不是宏.

  1. 函数体显然只包含对函数本身的调用,因此这将永远运行并导致堆栈溢出(双关语).

如果您查看相关联的头gatomic.h,您将看到确实定义了这样的宏.在函数体中,函数名周围没有使用方括号.这意味着,宏被使用并且它不是无限递归.

C++相关问答推荐

当包含头文件时,gcc会发出隐式函数声明警告

了解一些CLIPS原语数据类型

sizeof结果是否依赖于字符串的声明?

来自stdarg.h的c中的va_args无法正常工作<>

Tiva TM4C123GXL的I2C通信

编译的时候g++通常会比GCC慢很多吗?

如何知道我是否从非阻塞套接字读取所有内容

在C23中使用_GENERIC实现带有右值的IS_POINTER(P)?

如何捕捉只有换行符或空格字符缓冲区的边缘大小写

在移动数组元素时获得意外输出

For循环中的变量行为不符合预期.[C17]

在函数外部使用内联ASM时无法指定操作数

循环中的静态变量与块中的变量和循环

C23标准是否向后兼容?

';malloc():损坏的顶部大小';分配超过20万整数后

函数的typedef是标准 C 语法吗?它与函数指针的typedef有何不同?

Struct 内的数组赋值

在 C 中的 scanf() 格式说明符中使用宏获取字符串长度

C23 中的 [[reproducible]] 和 [[unsequenced]] 属性是什么?什么时候应该使用它们?

如何让 unlinkat(dir_fd, ".", AT_REMOVEDIR) 工作?