c - Windows互斥体的gcc编译错误

标签 c windows mutex

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

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

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);

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

最佳答案

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

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

这个错误也不是特定于 Mutexes 的。以下代码也会引发错误:

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 在评论中所说:“问题是 [that ghMutex] 在函数之外。”

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

关于c - Windows互斥体的gcc编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35965279/

相关文章:

c - 指针数组的动态分配

c++ - 带有 PNG/Alpha channel 图像的图像列表

c++ - boost:如何监视互斥体的状态并在死锁时强制释放

C# 通过引用互斥

c - 为什么这个 strlen() 的实现有效?

c - 与MuPDF链接的GTK3 C程序失败(即使未调用)

python - Cython 基本构建仍然失败

php - 使用 PHP 在外部服务器中运行应用程序

c - 使用 emscripten 找不到 Windows.h

c - 在 FreeRTOS 中使用 Mutex 实现两个任务同步