繁体   English   中英

如何外部声明一个外部“C”变量

[英]How to extern declare an extern “C” variable

我想从 dll 导出一个全局变量,我定义如下全局变量。 假设这个变量是在 A.cpp 中定义的

extern "C" __declspec(dllexport) int A;

同时,在 dll 中,另一个源文件 B.cpp 想要使用和修改这个值。 我想知道如何在使用之前在 B.cpp 中声明变量。

extern "C" int A; ? 

如果在这种情况下,编译如何识别声明和定义?

extern extern "C" int A; ?

它肯定是不正确的。

根据 [basic.def]/2.2,在命名空间 scope 中声明 object 是一个定义,除非:

它包含extern说明符 (9.2.1) 或链接规范19 (9.11),既不包含初始化程序,也不包含函数体
...
19链接规范中出现在大括号括起来的声明序列中不会影响声明是否是定义。

因此:

extern "C" int A; 是一个声明。

extern "C" int A = 0; 是一个定义。

下面定义AB ,并声明C :效果与没有extern "C"块的情况相同,只是声明的实体具有 C 链接而不是 ZF6F87C9FDCF8B3C3F07ZF93F1 链接。

extern "C" {
    int A;
    extern int B = 0;
    extern int C;
}

extern extern "C" int A; ?

extern "C"可以用作块:

extern "C"
{
    extern int A;
}

声明需要在 header 文件中,例如 Ah 或其他代码文件不能使用它。 如果没有 header 文件,dllexport 尤其无用。 您可能需要某种 DLLEXPORT 宏,因此您可以根据需要将其定义为 dllexport 和 dllimport。 查看几乎所有 Windows DLL 代码。

然后在一个 cpp 文件中包含 header。 这允许您的代码使用声明为extern的变量。

在您的一个cpp 文件中,您包含 header 然后使用相同的类型和名称定义变量,而不使用外部变量。 然后,linker 会将其数据存储放入与该 cpp 文件的 rest 相同的模块中,并且该名称的所有其他用途都链接到该定义。

然而,就像 C++ 中的私有成员变量一样,在 DLL 中公开全局变量是个坏主意。 最好在 function 调用后面隐藏对它们的访问。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM