Skip to content

Latest commit

 

History

History
56 lines (53 loc) · 1.8 KB

portability-at-abi-boundaries-modern-cpp.md

File metadata and controls

56 lines (53 loc) · 1.8 KB
title Portability At ABI Boundaries (Modern C++) | Microsoft Docs
ms.custom
ms.date 11/04/2016
ms.reviewer
ms.suite
ms.technology
cpp-language
ms.tgt_pltfrm
ms.topic article
dev_langs
C++
ms.assetid abbd405e-3038-427c-8c24-e00598f0936a
caps.latest.revision 4
author mikeblome
ms.author mblome
manager ghogen
translation.priority.ht
cs-cz
de-de
es-es
fr-fr
it-it
ja-jp
ko-kr
pl-pl
pt-br
ru-ru
tr-tr
zh-cn
zh-tw

Portability At ABI Boundaries (Modern C++)

Use sufficiently portable types and conventions at binary interface boundaries. A “portable type” is a C built-in type or a struct that contains only C built-in types. Class types can only be used when caller and callee agree on layout, calling convention, etc. This is only possible when both are compiled with the same compiler and compiler settings.

How to flatten a class for C portability

When callers may be compiled with another compiler/language, then “flatten” to an extern "C" API with a specific calling convention:

// class widget {  
//   widget();  
//   ~widget();  
//   double method( int, gadget& );  
// };  
extern "C" {        // functions using explicit "this"  
   struct widget;   // opaque type (forward declaration only)  
   widget* STDCALL widget_create();      // constructor creates new "this"  
   void STDCALL widget_destroy(widget*); // destructor consumes "this"  
   double STDCALL widget_method(widget*, int, gadget*); // method uses "this"  
}  

See Also

Welcome Back to C++
C++ Language Reference
C++ Standard Library