小编Qua*_*Dot的帖子

为什么 serde 的 Serialize/Deserialize 派生会在 const _: () 块中生成代码?

注意:这个问题并不是专门关于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 _: () …

compile-time rust rust-proc-macros

4
推荐指数
1
解决办法
55
查看次数

gfortran延续线的最大数量

我需要一点帮助:根据这个网站,延续线的最大数量是有限制的.

所以我决定测试一下.我写了一个巨型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 limits gfortran

3
推荐指数
1
解决办法
215
查看次数

如何将单独文件中的Fortran FUNCTION / SUBROUTINE编译为单个模块

通常,当我编写一个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.f90mysubrtn2.f90以便在.o文件中生成单个模块?

fortran include gfortran

2
推荐指数
1
解决办法
6509
查看次数