windows mutex的gcc编译错误

时间:2016-03-13 01:01:23

标签: c windows mutex

为什么编译会给我error: initializer element is not constant简单创建互斥锁HANDLE ghMutex = CreateMutex( NULL, FALSE, NULL);

我试过搜索,但我完全被难过了。无论我做什么,它都不会编译。我甚至试图分解它:

HANDLE ghMutex;
ghMutex = CreateMutex( NULL, FALSE, NULL);

编译抱怨:

test.c:90:1: error: conflicting types for 'ghMutex'
test.c:89:8: note: previous declaration of 'ghMutex' was here
 HANDLE ghMutex;
        ^
test.c:90:1: error: initializer element is not constant
 ghMutex = CreateMutex( NULL, FALSE, NULL);

我认为我的语法有问题我只是不知道是什么。

1 个答案:

答案 0 :(得分:2)

对于函数之外的变量,在C中,它们是可执行文件的.data部分的一部分,其中内存在编译时分配。没有常量(CreateMutex的返回变量不是),就无法知道要分配多少内存。

为了避免这种情况,编译器会抛出一个错误,因此您必须将初始化放在一个函数中,以便在运行时动态分配内存。

此错误也不是特定于互斥锁。以下代码也会抛出错误:

int x = 3;
int y = 5;
int z = x*y;
int main(void)
{
    return 0;
}

如果您只是想知道如何解决错误,那么您可以这样做:

#include <windows.h>    

HANDLE ghMutex;

int main(void)
{
    ghMutex = CreateMutex(NULL, FALSE, NULL);
    CloseHandle(ghMutex);
    return 0;
}

这是有效的,因为ghMutex是在运行时分配的,因为它在一个函数中。正如OP在评论中所述:“问题是[ghMutex是]在函数之外。”

或者,如果您想要更深入的视图,文档也会显示:https://msdn.microsoft.com/en-gb/library/windows/desktop/ms686927(v=vs.85).aspx