【发布时间】: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 或者它没有发生。