小编Seb*_*rek的帖子

如何在 C++ 数据结构中存储 Fortran 风格的长字符标量

我正在使用一个旧的 Fortran 库,它需要一个字符标量PATH作为子例程的参数。原来的界面是:

SUBROUTINE MINIMAL(VAR1, ..., PATH)

CHARACTER (LEN=4096) PATH

...
Run Code Online (Sandbox Code Playgroud)

我需要能够从 C++ 调用它,因此我进行了以下更改:

SUBROUTINE MINIMAL(VAR1, ..., PATH) &
    BIND (C, NAME="minimal_f")

    USE ISO_C_BINDING, ONLY: C_CHAR, C_NULL_CHAR

    CHARACTER (KIND=C_CHAR, LEN=1), DIMENSION(4096), INTENT(IN) :: PATH
    CHARACTER (LEN=4096):: new_path

!   Converting C char array to Fortran CHARACTER.
    new_path = " "
    loop_string: do i=1, 4096
        if ( PATH (i) == c_null_char ) then
            exit loop_string
        else
            new_path (i:i) = PATH (i)
        end if
    end do loop_string
Run Code Online (Sandbox Code Playgroud)

根据这个答案。这可以将 C …

c c++ fortran language-interoperability

6
推荐指数
1
解决办法
338
查看次数

C++20 <chrono> 嵌套名称说明符中使用的不完整类型

现在,支持新日历和时区功能的GCC 11已发布,我正在尝试在我的代码中使用这些功能。

\n

使用以下最小示例:

\n
#include <chrono>\n#include <iostream>\n\nint main()\n{\n    using namespace std;\n\n    cout << chrono::utc_clock::now() << endl;\n\n    return EXIT_SUCCESS;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

使用以下内容编译:

\n
> /usr/local/gcc-11.1.0/bin/g++-11.1 -std=c++-20 main.cpp\n
Run Code Online (Sandbox Code Playgroud)\n

给出以下错误:

\n
main.cpp: In function \xe2\x80\x98int main()\xe2\x80\x99:\nmain.cpp:8:36: error: incomplete type \xe2\x80\x98std::chrono::utc_clock\xe2\x80\x99 used in \n    nested name specifier\n    8 |         cout << chrono::utc_clock::now() << endl;\n      | \n
Run Code Online (Sandbox Code Playgroud)\n

我调查了这个错误,它似乎通常源于前向声明。有谁知道为什么会发生这种情况?

\n

我还尝试显式链接新建的 GCC 11 版本的 libstdc++.a:

\n
/usr/local/gcc-11.1.0/bin/g++-11.1 -std=c++20 -L/usr/local/gcc-11.1.0/lib -lstdc++ main.cpp\n
Run Code Online (Sandbox Code Playgroud)\n

但我收到同样的错误消息。

\n

一些额外信息:

\n
> /usr/local/gcc-11.1.0/bin/g++-11.1 --version\n
Run Code Online (Sandbox Code Playgroud)\n

给出以下输出: …

c++ gcc libstdc++ c++-chrono c++20

5
推荐指数
1
解决办法
1635
查看次数