uuidof在gcc中的實現

2021-08-08 03:13:42 字數 2930 閱讀 1149

在windows的com模組,或者相關的**如果想要移植到linux上,往往會碰到很多問題,最常見的是__uuidof在gcc上不是內生支援,但是在vc上是基本的operator,相信這個問題也有不少人碰到,並且為此頭痛的,下面介紹一種如果利用c++11/14的通用方法解決此問題。

(我同時也發表了這篇文章在stackoverflow:

先上**:

#include 

#include

#include

using

namespace

std;

#define nybble_from_hex(c) ((c>='0'&&c<='9')?(c-'0'):((c>='a'&&c<='f')?(c-'a' + 10):((c>='a'&&c<='f')?(c-'a' + 10):0)))

#define byte_from_hex(c1, c2) ((nybble_from_hex(c1)<<4)|nybble_from_hex(c2))

typedef

struct _guid guid;

static guid guid_null = };

#ifndef _refguid_defined

#define _refguid_defined

#ifdef __cplusplus

#define refguid const guid &

#else

#define refguid const guid * __midl_const

#endif

#endif

__inline int isequalguid(refguid rguid1, refguid rguid2)

#ifdef __cplusplus

__inline bool

operator==(refguid guidone, refguid guidother)

__inline bool

operator!=(refguid guidone, refguid guidother)

#endif

struct initializable : public guid

assert(spec[8] == '-');

for (int i = 9; i < 13; ++i)

assert(spec[13] == '-');

for (int i = 14; i < 18; ++i)

assert(spec[18] == '-');

for (int i = 19; i < 23; i += 2)

assert(spec[23] == '-');

for (int i = 24; i < 36; i += 2)

}};template

inline

auto __my_uuidof()

-> guid const &

#define cppx_gnuc_uuid_for( name, spec ) \

template

<> \

inline \

auto __my_uuidof() \

-> guid const& \\\

template

<> \

inline \

auto __my_uuidof() \

-> guid const& \\\

static_assert( true, "" )

auto

operator

"" _uuid(char

const* const s, size_t const size)

-> guid

#define cppx_uuid_for cppx_gnuc_uuid_for

#define __uuid(t) __my_uuidof()

struct foo {};

cppx_uuid_for(foo, "dbe41a75-d5da-402a-aff7-cd347877ec00");

foo foo;

template

void queryinte***ce(t** p)

else

return;

}int main()

儲存為uuidtest.cpp,編譯並且執行它:

g++-7 uuidtest.cpp -o uuidtest

./uuidtest

p:0x6021c0, &foo: 0x6021c0

**稍微解釋一下:

首先用到user defined literal:

operator"" _uuid(...)
它會吧uuid string轉化成guid

然後用到了function template specialization的feature,它可以給每個類定義乙個特殊的__uuidof實現,然後定義乙個巨集讓**呼叫__uuidof(…)會走到這些特殊的__uuid的實現中去,這是**的關鍵。

#define __uuid(t)       __my_uuidof()

gcc在Linux中的編譯

tar zxvf gcc 10.2.0.tar.gz cd gcc 10.2.0.tar.gz進行這一步 contrib download prerequisites如果不出錯就直接到第四步 2.檢視contrib資料夾內的download prerequisites gmp gmp 6.1.0.t...

GCC中實現c 的 foreach

boost 1.34中提供了foreach,只可惜這個實現也太醜陋了,根本沒有實用價值。其實在gcc中實現foreach是相當簡單的,因為 gcc 提供了typeof 關鍵字。這裡提供乙個實現,與boost不同,用的是 iterator 的概念。用法 vector string vec foreac...

可變長陣列在GCC編譯器中的實現

在c99中新加入了對變長陣列的支援,即陣列的長度可以由某個非const變數來定義。可變陣列的空間大小直到程式執行時才能確定,因此只有程式在執行時才能為程式分配空間。在gcc編譯器程式會在執行時根據實際指定的大小 變數當前的值 調節esp的值,為陣列在棧上分配適當大小的空間。由於要在執行時才能為陣列分...