コンパイルと実行に関する相違点

インテル® oneAPI DPC++/C++ コンパイラーは、Microsoft* Visual C++* コンパイラーと互換性はありますが、相違点もいくつかあり、正常にコンパイルできない場合があります。また、一部のソースファイルについては、インテル® oneAPI DPC++/C++ コンパイラーで互換性のないコードが生成されることがあります。ほとんどの場合は、ソースファイルを修正すればインテル® oneAPI DPC++/C++ コンパイラーでも Microsoft* Visual C++* コンパイラーでも正常にコンパイルできます。次に、この両者の相違点について説明します。

インライン・アセンブリーのターゲットラベル (IA-32 アーキテクチャーのみ)

これは C++ 固有のコンテンツです。DPC++ には適用されません。

IA-32 アーキテクチャーを対象にコンパイルする場合、goto 文のインライン・アセンブリー・ターゲット・ラベルは大文字と小文字が区別されます。Microsoft* Visual C++* コンパイラーは、このようなラベルを扱うときに大文字と小文字を区別しません。例えば、次のコードをコンパイルするとインテル® oneAPI DPC++/C++ コンパイラーからはエラーが発行されます。

int func(int x) {
   goto LAB2;
     // エラー: 定義されていないラベル "LAB2" が参照されている
   __asm lab2: mov x, 1
   return x;
}

しかし、Microsoft* Visual C++* コンパイラーではこのコードを問題なく処理できます。インテル® oneAPI DPC++/C++ コンパイラーを使用する際には、インライン・アセンブリーの中で定義しているラベルを goto 文で参照する場合、そのラベル参照とラベル定義について、名前の大文字と小文字の違いも一致させてください。

dllimport 関数のインライン展開

Microsoft* コンパイラーは dllimport 関数をインライン展開しませんが、インテル® oneAPI DPC++/C++ コンパイラーは、dllimport 関数のインライン展開を試みます。そのため、dllimport ルーチン内で使用される呼び出しと変数がリンク時に利用できなければなりません。そうでないと、シンボルが未解決になります。

次の例には、header.hbug.cpp の 2 つのファイルが含まれます。

header.h

#ifndef _HEADER_H
#define _HEADER_H
namespace Foo_NS { 

        class Foo2 { 
        public: 
                Foo2(){}; 
                ~Foo2(); 
                static int test(int m_i); 
        }; 
} 
#endif

bug.cpp

#include “header.h”
struct Foo2 { 
  static void test(); 
}; 

struct __declspec(dllimport) Foo 
{ 
   void getI() { Foo2::test(); }; 
}; 

struct C  { 
  virtual void test(); 
}; 

void C::test() { Foo* p;  p->getI(); } 

int main() { 
   return 0; 
}