注意:这个问题并不是专门关于serde
:它是关于过程宏和 const 函数。
我正在研究serde的派生宏为Serialize
和生成的代码Deserialize
,但我还没有弄清楚为什么它的所有代码都在const _: ()
.
例如,
#[derive(Deserialize)]
struct MyNewType(i32);
Run Code Online (Sandbox Code Playgroud)
扩展为(使用cargo expand
):
#[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications)]
const _: () = {
#[allow(unused_extern_crates, clippy::useless_attribute)]
extern crate serde as _serde;
#[automatically_derived]
impl<'de> _serde::Deserialize<'de> for MyNewType {
fn deserialize<__D>(
__deserializer: __D,
) -> _serde::__private::Result<Self, __D::Error>
where
__D: _serde::Deserializer<'de>,
{
// generated implementation omitted for brevity
}
}
};
Run Code Online (Sandbox Code Playgroud)
我发现,如果我仔细复制块内的内容const _: () = {...}
,并在删除标签后将其粘贴回源代码中#[derive(Deserialize)]
,那么一切似乎都会编译并且反序列化继续正常工作。const _: () …
我需要一点帮助:根据这个网站,延续线的最大数量是有限制的.
所以我决定测试一下.我写了一个巨型FUNCTION
,它计算了在陈述中分成17,146个延续线的巨大代数公式.
!test.f90 1.6 MB file
DOUBLE COMPLEX FUNCTION myfunction(a, b)
DOUBLE COMPLEX, INTENT(IN) :: a
DOUBLE COMPLEX, INTENT(IN) :: b
myfunction = gd0/16.d0)*a*b*((a+b)**2)*((32.d0*DCONJG(f(4)))+(12&
&8.d0*DCONJG(f(11)))+(160.d0*DCONJG(f(24)))+(64.d0*DCONJG(f(46)))+(32.d0*DCONJG(f(3)))+(256.d0*DCON&
&JG(f(10)))+(480.d0*DCONJG(f(23)))+(256.d0*DCONJG(f(45)))+(32.d0*DCONJG(g(9)))+(128.d0*DCONJG(f(&
&9)))+(480.d0*DCONJG(f(22)))+(384.d0*DCONJG(f(44)))+(96.d0*DCONJG(g(21)))+(160.d0*DCONJG(f(21)))+(2&
&56.d0*DCONJG(f(43)))+(64.d0*DCONJG(g(42)))+(64.d0*DCONJG(f(42)))+(64.d0*DCONJG(f(8)))+(192.d0*DCON&
& (64.d0*DCONJG(g(42)) ! and so on and so forth...
END FUNCTION
Run Code Online (Sandbox Code Playgroud)
我编译了这个gfortran -c test.f90
令人厌恶的东西,它test.o
在5分钟后返回了一个11.4MB的文件,没有任何错误或警告.我跑了,它返回了正确的结果.
为什么不gfortran
观察最大延续线规则?
通常,当我编写一个Fortran函数集合时,我将它们放入MODULE
这样的环境中:
!mystuff.f90
MODULE mymodule
IMPLICIT NONE
CONTAINS
SUBROUTINE mysubroutine1(a,b)
!code
END SUBROUTINE
SUBROUTINE mysubroutine2(a,b)
!code
END SUBROUTINE
!lots more functions and subroutines
END MODULE
Run Code Online (Sandbox Code Playgroud)
这样我就成功地编译了它 gfortran -c mystuff.f90
。这样mystuff.o
就可以在主程序中使用它了。
但是,我中的函数/子例程的数量和大小MODULE
已经变得非常庞大,以至于我真的需要将其分解为不同的文件。
!mysubrtn1.f90
SUBROUTINE mysubroutine1(a,b)
!code
END SUBROUTINE
Run Code Online (Sandbox Code Playgroud)
和
! mysubrtn2.f90
SUBROUTINE mysubroutine2(a,b)
!code
END SUBROUTINE
Run Code Online (Sandbox Code Playgroud)
等等...
但是我仍然希望将所有这些功能放在一个单一的 MODULE
。如何告诉编译器在,,...中编译函数mysubrtn1.f90
,mysubrtn2.f90
以便在.o
文件中生成单个模块?