【问题标题】:gcc compile error for windows mutexwindows互斥体的gcc编译错误
【发布时间】:2016-03-13 01:01:23
【问题描述】:

为什么编译给我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);

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

【问题讨论】:

  • 我们能看到这段代码的上下文吗?您是否尝试在函数之外执行此操作?
  • 是的,它在函数之外。这可能是问题吗?
  • 第一个错误之后的错误(尤其是在同一代码中)通常是其后果。如果问题仍然存在,请解决冲突的类型声明并编辑问题。
  • @JoachimIsaksson 是对的。问题出在功能之外。我刚开始在 Windows 上玩 c。菜鸟错误。

标签: c windows mutex


【解决方案1】:

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

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

此错误也不是 Mutex 特有的。以下代码也会抛出错误:

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 is] 在函数之外。”

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-17
    • 2017-11-17
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    相关资源
    最近更新 更多