我正在使用一个旧的 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 …
现在,支持新日历和时区功能的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给出以下错误:
\nmain.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给出以下输出: …