0

glfw を使用してゲームを構築し始めました。私はCとC ++にはかなり慣れていませんが、以前はAndroidでopenGLを使用していました。私はすべてのopenGLの作業を行っており、glfwでスレッドを作成しようとしています.

ここにいくつかの基本的なテストコードがあります。ドキュメントの内容に似ています。

#include <GL/glfw.h>
#include <stdio.h>

GLFWthread thread;

void GLFWCALL testThread()
{
    printf("hello\n");
}

int main()
{
    printf("test\n");

    glfwInit();

    thread = glfwCreateThread(testThread, NULL);
    glfwWaitThread(thread, GLFW_WAIT);

    glfwTerminate();
    return 1;   
}

これは gcc で正常にコンパイルされ、期待どおりに動作します。

$ gcc -o glthread glthread.c -lglfw
$ ./glthread
test
hello

問題は、クラスのような C++ 機能を利用したいということです。g ++でコンパイルすると、これが得られます...

$ g++ -o glthread glthread.c -lglfw
glthread.c: In function ‘int main()’:
glthread.c:18: error: invalid conversion from ‘void (*)()’ to ‘void (*)(void*)’
glthread.c:18: error:   initializing argument 1 of ‘GLFWthread glfwCreateThread(void (*)(void*), void*)’

クラスに入れると、重大なエラーがこれに変わります。

error: argument of type ‘void (Renderer::)()’ does not match ‘void (*)(void*)’

私が基本的に知りたいのは、c ++でglfwを使用してスレッドを作成することは可能ですか?

これに取り組むための私のメイン PC は、arch Linux マシンです。現在、コンパイラのバージョンを提供することはできません。それが助けになるなら、私は後でそれらを手に入れることができます.

4

1 に答える 1

1
void GLFWCALL testThread()
{
    printf("hello\n");
}

型の引数を 1 つ受け取る必要void*があり、クラス関数へのポインターのシグネチャは ではなく であるため、ここではクラス関数を使用できませRet (Class::*)(args)void (*)(void*)。スレッドでクラスメンバーへのポインターを使用する場合は、より多くの C++ スタイル ライブラリ (などを使用するboost::threadか、独自のラッパーを作成する必要があります)。

あなたの例は C で動作します。C では空の括弧 (つまり () ) は - 任意の型の任意の数のパラメーターを意味しますが、C++ () では、その関数はパラメーターをまったく受け取らないことを意味します。

于 2013-05-15T09:05:44.930 に答える