Compilation and Execution Differences

While the Intel® oneAPI DPC++/C++ Compiler is compatible with the Microsoft Visual C++* Compiler, some differences can prevent successful compilation. Also there can be some incompatible generated-code behavior of some source files with the Intel oneAPI DPC++/C++ Compiler. In most cases, a modification of the user source file enables successful compilation with both the Intel oneAPI DPC++/C++ Compiler and the Microsoft Visual C++ Compiler. The differences between the compilers are listed as follows:

Inline Assembly Target Labels (IA-32 Architecture Only)

This content is specific to C++; it does not apply to DPC++.

For compilations targeted for IA-32 architecture, inline assembly target labels of goto statements are case sensitive. The Microsoft Visual C++ compiler treats these labels in a case insensitive manner. For example, the Intel oneAPI DPC++/C++ Compiler issues an error when compiling the following code:

int func(int x) {
   goto LAB2;
     // error: label "LAB2" was referenced but not defined
   __asm lab2: mov x, 1
   return x;
}

However, the Microsoft Visual C++ Compiler accepts the preceding code. As a work-around for the Intel oneAPI DPC++/C++ Compiler, when a goto statement refers to a label defined in inline assembly, you must match the label reference with the label definition in both name and case.

Inlining Functions Marked for dllimport

The Intel oneAPI DPC++/C++ Compiler will attempt to inline any functions that are marked dllimport but Microsoft* will not. Therefore, any calls or variables used inside a dllimport routine needs to be available at link time or the result will be an unresolved symbol.

Example

The following example contains two files: header.h and bug.cpp.

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; 
}