/*---------------------------------------------------------------------------* Project: Horizon File: util_CLibImpl.h Copyright (C)2009 Nintendo Co., Ltd. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Rev: 16709 $ *---------------------------------------------------------------------------*/ /*! @file @brief C インタフェースを実装する為のユーティリティヘッダ */ #ifndef NN_UTIL_DETAIL_UTIL_CLIBIMPL_H_ #define NN_UTIL_DETAIL_UTIL_CLIBIMPL_H_ #include #include #include #ifdef __cplusplus /*! @def NN_EXTERN_C @brief 外部リンケージを C で宣言します。 */ #define NN_EXTERN_C extern "C" #define NN_UTIL_DETAIL_CLIBIMPL_DEFINE_BUFFER_CLASS(cname, cppname, size, alignment_holder_type) \ typedef union cname \ { \ char buf[size]; \ alignment_holder_type alignment_holder; \ NN_STATIC_ASSERT((size) == sizeof(cppname) && ::nn::util::alignment_of::value == ::nn::util::alignment_of::value); \ } cname #else #define NN_EXTERN_C extern #define NN_UTIL_DETAIL_CLIBIMPL_DEFINE_BUFFER_CLASS(cname, cppname, size, alignment_holder_type) \ typedef union cname \ { \ char buf[size]; \ alignment_holder_type alignment_holder; \ } cname #endif #define NN_UTIL_DETAIL_CLIBIMPL_DEFINE_ABSTRACT_BUFFER_CLASS(name) typedef struct { bit8 dummy; } name; #define NN_UTIL_DETAIL_CLIBIMPL_DECLARE_CONVERSION(name, fromC, toC) \ NN_EXTERN_C toC* name(fromC*); \ NN_EXTERN_C const toC* name##Const(const fromC*) #define NN_UTIL_DETAIL_CLIBIMPL_DEFINE_CONVERSION(name, fromC, toC, fromCpp, toCpp) \ NN_EXTERN_C toC* name(fromC* p) { return reinterpret_cast(static_cast(reinterpret_cast(p))); } \ NN_EXTERN_C const toC* name##Const(const fromC* p) { return reinterpret_cast(static_cast(reinterpret_cast(p))); } #endif /* @defgroup page_for_c_users C 言語用ラッパーについて @brief C 言語用ラッパーについて @{ CTR-SDK の API は主に C++ で構成されています。 C++ の API は C のファイルから直接呼び出す事はできません。 このため CTR-SDK では、C のソースファイルから C++ の API を 呼び出せるようにラッパー関数を用意しています。 ミューテックスの例 C++ でミューテックスを使う為には @ref nn::os::Mutex クラスを利用します。Mutex クラスは内部にミューテックスオブジェクトを保持しています。 このクラスを C で利用する為のラッパー関数は以下のように nnosMutex~で始まる名前を持ちます。 またこれらの関数は C++ のメソッドと 1 対 1 の関係を持っています。 @li @ref nnosMutexInitialize → @ref nn::os::Mutex::Initialize
@li @ref nnosMutexLock → @ref nn::os::Mutex::Lock
@li @ref nnosMutexTryLock → @ref nn::os::Mutex::TryLock
@li @ref nnosMutexUnlock → @ref nn::os::Mutex::Unlock
@li @ref nnosMutexInitialize → @ref nn::os::Mutex::Initialize
C ラッパー関数の詳細が知りたい場合は、対応するクラスのメソッドの説明を参照して下さい。 一方、C においてミューテックスオブジェクトを保持する型は @ref nnosMutex 構造体です。 この構造体は内部的にはクラスのインスタンスであり、C 言語からは中身を参照する事はできません。 一覧 C 及び C++ でそれぞれ利用できるモジュールの一覧はモジュールのページを参照して下さい。 @} */