私は突然gcc 6の下で警告を出すC++のFortranルーチンを呼び出す科学計算コードを使用します。 。ここでは必要最小限の問題である:C++のstd :: complexとcomplex :: 16の間の型不一致gcc 6の下でリンク時の最適化
はmult.f90
で定義されたFortranのサブルーチンmult
を考えてみましょう:
subroutine mult(c)
complex*16 c
c = c * c
return
end
私はC++ファイルtest.cpp
からこれを呼び出す:
#include <complex>
#include <iostream>
extern "C" void mult_(std::complex<double> *);
int main() {
std::complex<double> z (1,0);
mult_(&z);
std::cout << z << "\n";
return 0;
}
私はG ++使用してファイルをコンパイルするとき - 6を、私は次の警告を得る:私は、次のいずれかを行う場合
$ g++-6 -O3 -W -Wall test.cpp mult.f90 -flto -o test2
test.cpp:4:17: warning: type of ‘mult_’ does not match original declaration [-Wlto-type-mismatch]
extern "C" void mult_(std::complex<double> *);
^
mult.f90:1:1: note: ‘mult’ was previously declared here
subroutine mult(c)
^
mult.f90:1:1: note: code may be misoptimized unless -fno-strict-aliasing is used
警告が消える: - 6(バージョンI
- グラム++を交換してください有するG ++で)6.2.0である - 5(バージョン5.4.1)
- コンパイル
-flto
フラグ - 使用せず二重(代わりのstd ::の複合体)とREAL * 8(代わりの複合* 16)
私は心配すべきですか、それとも私が無視できる警告ですか?前者の場合、どのように問題を解決できますか?
を心配する必要はありませんので、呼び出し規約などは、まったく同じです。次に、非標準の 'complex * 16'を' complex(c_double_complex) 'に変更し、' bind(C) 'を使うことができます。これには、C++コードでのFortranの名前のマングリングをシミュレートする必要がないという利点があります(つまり、 'mult_'ではなく' mult'を参照するだけです)。 – Yossarian
それは役に立たないようですが、ISO Cバインディングが使用されているときに同じ警告が表示されます。 –