Fortran 'parameter' type not included in c

2020-04-08 11:45发布

I have a Fortran module that contains some variables that have the attribute parameter and some have the attribute save. The parameter ones are not included in the compiled object, which becomes a problem when trying to assemble a library. For example, consider a file testModule.f90:

module testMOD
  integer, save :: thisIsSaved = 1
  integer, parameter :: thisIsParametered = 2
end module testMOD

I compile this with: ifort -c testModule.f90. When I check what's inside it:

>$ nm testModule.o
0000000000000000 T testmod._
0000000000000000 D testmod_mp_thisissaved_

only the thisIsSaved variable is there. I know that I can just change thisIsParametered to save rather than parameter but, ideally, I'd like to prevent a linking user from changing this value. Is there a way to do this?

Edit: I'd like this library to be accessible to C codes, as well, not just Fortran.

2条回答
等我变得足够好
2楼-- · 2020-04-08 12:11

As others have noted, a parameter is a named constant and implementations may not set aside storage for that constant in the object code (particularly for scalars).

Your library should provide a header file for your C clients. You can define the value of the Fortran parameter in that header file, either by #define or const.

This requires maintenance of the value of the parameter in two places, but you already have that maintenance burden with other aspects of the library's interface.

查看更多
我欲成王,谁敢阻挡
3楼-- · 2020-04-08 12:24

That should actually be stored in the .mod file. All of the data types and function prototypes are stored there which is why you need to include it when you send someone a .lib file. Try linking in the module after using it in something else and it should work just fine.

Essentially the .mod file serves the same purpose as the .h file in c, so of course you are going to have to include it with your library.

[update:] If you are attempting to use this in C, then as you said, there is no means for you to easily maintain the named constant. As an alternative, you can use the protected attribute on the entity. At least with Fortran, anything outside of the module is restricted from writing to the variable. I don't know if the C compiler and the linker will respect this behavior, but I think this is probably your best shot.

module testMOD
 INTEGER, PROTECTED, BIND(C)  :: globalvar = 1
end module testMOD

Unfortunately I don't really do much with interoperability with C, so I can't really guarantee that C will respect the protected attribute and not allow the variable to be changed.

查看更多
登录 后发表回答