【发布时间】:2021-11-02 18:50:21
【问题描述】:
在调用采用 logical 参数的 Fortran 函数时,我应该在 C 中使用什么参数类型,特别是使用 gfortran?这在哪里记录了 gfortran?
这是一个没有警告就无法编译的示例程序:
one.f的内容:
subroutine proc1(x)
logical x
end
main.c的内容:
void proc1_(_Bool *x);
int main() {
_Bool x;
proc1_(&x);
return 0;
}
如果我使用 GCC 编译如下,并启用 LTO,我会收到有关函数原型不匹配的警告:
gfortran -flto -c one.f
gcc -flto -c main.c
gcc -flto main.o one.o
我收到的警告:
main.c:2:6: warning: type of 'proc1_' does not match original declaration [-Wlto-type-mismatch]
2 | void proc1_(_Bool *x);
| ^
one.f:2:22: note: 'proc1' was previously declared here
2 | subroutine proc1(x)
| ^
one.f:2:22: note: code may be misoptimized unless '-fno-strict-aliasing' is used
请注意,启用 LTO 允许链接器验证原型之间的参数类型是否匹配。不幸的是,使用 LTO 不是我们的选择。 CRAN 要求在启用 LTO 的情况下编译提交的代码而不会出现这些警告。
我只在尝试使用 logical 参数时看到问题。 real、integer 和 character 都可以。
可以要求 gfortran 生成 C 原型,这是它给我的输出:
gfortran -flto -fc-prototypes-external -c one.f
void proc1_ (int_fast32_t *x);
在 C 原型中使用 int_fast32_t 也不起作用。我试过的类型都没有,int 和 _Bool 都没有。通常,当原型之间存在类型不匹配时,错误消息会提及类型应该是什么——但在这种情况下不是。
我怎样才能找到要使用的正确类型?
【问题讨论】:
标签: c fortran prototype gfortran