在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的值,為陣列在棧上分配適當大小的空間。由於要在執行時才能為陣列分...