【问题标题】:Typedef Variables for Global Use?Typedef 变量供全局使用?
【发布时间】:2015-12-13 06:06:30
【问题描述】:

假设我们有这个 decl 的源文件:

typedef VOID ( NTAPI *my_RtlInitUnicodeString ) (
PUNICODE_STRING DestinationString,
PCWSTR SourceString
);
my_RtlInitUnicodeString rtlInitUnicodeString;
//static has same effect

任何在源文件内部函数中使用 rtlInitUnicodeString 的尝试都需要像这样“重新定义”:

my_RtlInitUnicodeString rtlInitUnicodeString ....

单击任何源文件内部函数中使用的 rtlInitUnicodeString 的“定义”[VS] 总是会将我们带到它的主页:Winternl.h,而不是源文件范围的 decl。这是编译器的限制,还是有另一种方式可以使所有人和杂项都可以使用 rtlInitUnicodeString?

【问题讨论】:

  • 这是 C 还是 C++?
  • C 编译为 C++ 代码。
  • 我假设当您说“模块范围的 decl”时,您的意思是 C 文件,而不是模块代码包含的头文件。如果是这种情况,那么正如答案中所解释的那样,无论在何处使用变量,您都需要对变量进行 extern 声明。每个单独的 C 文件都是一个单独的编译单元,编译器不知道有一个“模块范围的 decl”,除非你明确告诉它 - 通过extern
  • 如果这是编译为 C++ 的 C 代码,您可能会遇到 C 和 C++ 之间的主要区别之一。 (与常见用法相反,没有 C/C++ 之类的东西。)参见stackoverflow.com/questions/6173872/…
  • MCVE 或者它没有发生。

标签: c++ global typedef


【解决方案1】:

您的程序中的变量定义不应超过一个。要使用来自不同编译单元的变量,每个使用它的编译单元都应该包含一个带有变量声明的头文件。声明应以关键字“extern”开头。这就是全局变量在 C 中的工作方式,与 typedef 无关。

【讨论】:

  • 嗯,这个设置有点可疑。 rtlInitUnicodeString 在模块中被识别,如问题中所述。
  • 您的问题中包含的信息很少。我的回答是基于对全局变量在 C 中如何工作的理解,并且我已经多次使用过它们。如果您认为我的回答是错误的,您应该发布您尝试编译的完整代码(在简化之后),准确说明您是如何编译它的,并显示您遇到的确切编译器错误。很可能,您忽略了一些细节,或者您在某处打错了字。请看stackoverflow.com/help/mcve
  • 你能说一下你是如何编译它并发布你得到的确切错误消息吗?
  • VS10 Pro Win32 使用 MS 符号调试 F5。其余的都在 MCVE proj 文件中。在 MCVE.c 中,它总是以 C2365 失败,如第 22 行末尾的注释中所述。如果第 53 行被注释掉,则第 54 行生成一个 C2659,如第 54 行末尾的注释中所述。如果 22 和 53 都是注释掉,54 生成一个 C2659。这就是为什么它应该在没有第 22 行但第 53 和 54 行的情况下编译是问题所在。谢谢。
【解决方案2】:

在注意到编译错误之前答案并不明显:

error C2659: '=' : function as left operand

有些东西打结了。但是解释为什么

my_RtlInitUnicodeString RtlInitUnicodeString = (my_RtlInitUnicodeString) GetProcAddress(hdlNtCreateFile, initUnicodeFnString); 

在源文件内部函数中起作用,但不是

RtlInitUnicodeString = (my_RtlInitUnicodeString) GetProcAddress(hdlNtCreateFile, initUnicodeFnString); 

需要超出我知识范围的理解。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多