相关疑难解决方法(0)

static vs extern"C"/"C++"

静态成员函数和extern"C"链接函数之间有什么区别?例如,在C++中使用"makecontext"时,我需要传递一个指向函数的指针.谷歌建议使用extern"C"链接,因为"makecontext"是C.但我发现使用静态工作也是如此.我只是幸运还是......

class X {
   public:
   static void proxy(int i) {}
}
makecontext(..., (void (*)(void)) X::proxy, ...);
Run Code Online (Sandbox Code Playgroud)

VS

extern "C" void proxy(int i) {}
makecontext(..., (void (*)(void)) proxy, ...);
Run Code Online (Sandbox Code Playgroud)

编辑:你能展示静态成员版本不起作用的编译器或架构(并且它不是编译器中的错误)吗?

c++ function-pointers static-members linkage extern-c

22
推荐指数
2
解决办法
2万
查看次数

C++ 0x是否支持__stdcall或extern"C"capture-nothing lambdas?

昨天我在考虑是否可以使用C++ 0x lambda函数的便利来为Windows API函数编写回调.

例如,如果我想将lambda用作EnumChildProcwith ,该EnumChildWindows怎么办?就像是:

EnumChildWindows(hTrayWnd, CALLBACK [](HWND hWnd, LPARAM lParam) {
        // ...
        return static_cast<BOOL>(TRUE); // continue enumerating
    }, reinterpret_cast<LPARAM>(&myData));
Run Code Online (Sandbox Code Playgroud)

另一个用途是extern "C"为C例程编写回调.例如:

my_class *pRes = static_cast<my_class*>(bsearch(&key, myClassObjectsArr, myClassObjectsArr_size, sizeof(my_class), extern "C" [](const void *pV1, const void *pV2) {
        const my_class& o1 = *static_cast<const my_class*>(pV1);
        const my_class& o2 = *static_cast<const my_class*>(pV2);

        int res;
        // ...
        return res;
    }));
Run Code Online (Sandbox Code Playgroud)

这可能吗?

我可以理解捕获变量的lambdas永远不会与C兼容,但至少对我来说似乎可以捕获 - 没有任何 lambda可以兼容.

c c++ lambda c++11

16
推荐指数
1
解决办法
2165
查看次数

标签 统计

c++ ×2

c ×1

c++11 ×1

extern-c ×1

function-pointers ×1

lambda ×1

linkage ×1

static-members ×1