我刚学C语言,知道怎么写函数:

return_type function_name() {}

看起来只有一个return type可以定义,然而,我看到Win32 API和Android JNI中的一些样式也编译成功:

LRESULT CALLBACK WindowProc()
JNIEXPORT void JNICALL Java_ClassName_MethodName()

我搞不懂为什么它们是两个或三个返回类型.我搜索发现这些可能是modifiers个,但我了解到的修饰语应该是static,long,unsigned这些关键字.

推荐答案

JNIEXPORTJNICALL不是类型;它们是宏,它们可以扩展为一些特定于平台的语言扩展,以声明函数的一些其他属性.

在本例中,CALLBACKJNICALL用于声明这些函数的calling convention.当使用动态链接时,JNIEXPORT将被用来标记函数被导出(当生成库时)或被导入(当链接到库时).

这些细节是为库提供稳定的ABI(应用程序二进制接口)所必需的.然而,这些细节不在C标准的范围之内.它们还取决于构建库所基于的平台和配置.因此,根据编译代码的场景,库编写者可以使用扩展为特定于平台的适当语法的宏.

C++相关问答推荐

如何将FileFilter添加到FileDialog GTK 4

是否定义了数组指针类型转换为指针类型?""""

当多个线程在C中写入相同的文件描述符时,如何防止争用情况?

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

错误:包含文件时类型名称未知

1处的解析器错误:yacc语法的语法错误

在C语言中,指针指向一个数组

获取前2个连续1比特的索引的有效方法

我在反转双向链表时遇到问题

如果格式字符串的内存与printf的一个参数共享,会发生什么情况?

为什么WcrTomb只支持ASCII?

如何在不读取整个字符串的情况下删除UTF8字符串的尾随空格以提高性能?

OMP并行嵌套循环

未使用sem_open正确初始化信号量

在分配内存后使用指针是未定义的行为吗?

Ubuntu编译:C中的文件格式无法识别错误

10 个字节对于这个 C 程序返回后跳行的能力有什么意义

C11 嵌套泛型

运行以下 C 程序时出现分段错误

strlen 可以是[[未排序]]吗?