首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Windows结构初始化错误C2099:初始值设定项不是常量

Windows结构初始化错误C2099:初始值设定项不是常量
EN

Stack Overflow用户
提问于 2020-04-30 10:41:11
回答 1查看 91关注 0票数 3

我是Windows的新手,我正在尝试用全局变量在Windows上编译一个简单的DLL,并在我的测试应用程序中使用Windows 10上的Visual-Studio 2017来使用全局变量。

以下是该应用程序的源代码

代码语言:javascript
复制
#include <stdio.h>

__declspec(dllimport) const char globalArr[];

typedef struct {
    const char *pData;
} MyStruct;

MyStruct myArr[] = {
    {
        globalArr
    }
};

int main() {
    printf("1 = %d\n", myArr[0].pData[0]);
    printf("2 = %d\n", myArr[0].pData[1]);
    printf("3 = %d\n", myArr[0].pData[2]);

    printf("1 = %d\n", globalArr[0]);
    printf("2 = %d\n", globalArr[1]);
    printf("3 = %d\n", globalArr[2]);

    return 0;
}

下面是DLL的源代码

代码语言:javascript
复制
__declspec(dllexport) const char globalArr[] = {
    0x00, 0x01, 0x02
};

当我使用下面的CMake项目编译主应用程序时

代码语言:javascript
复制
cmake_minimum_required(VERSION 3.9)

project(temp C)

add_library(mylib SHARED lib.c)
add_executable(myexec main.c)

target_link_libraries(myexec mylib)

我得到以下错误"main.c(11):error C2099: initializer is not a constant“。在linux上编译这段代码似乎是可行的(唯一的区别是删除了__declspec)。为什么Windows会抛出编译错误?

EN

回答 1

Stack Overflow用户

发布于 2020-04-30 11:00:26

对于__declspec(dllimport) const char globalArr[];,这意味着在运行的可执行文件链接到globalArr之前,符号DLL不会获得值。即使在使用导入库时,这种链接仍然会在运行时发生。

“加载时动态链接”的过程类似于“运行时动态链接”,只是它发生在输入main之前。

因此,不能在静态数据初始化器中使用该值,因为C要求在编译时知道这些初始化器。

相反,您可以在链接DLL之后在main中设置该值,例如:

代码语言:javascript
复制
MyStruct myArr[1];

int main()
{
    myArr[0].pData = globalArr;
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61515023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档