我有一个头文件,其中包含许多声明:
extern ID3D10Device* device;
由于多个翻译单元的问题,我不能使这些静态,并且由于类似的原因我不能将它们作为普通指针。但是,当我尝试构建程序时,我得到了未解析的外部符号链接器错误。我假设这是因为我试图使用指针而不先定义它们。然而,这是问题,因为初始化这些DirectX对象的方法是将指针的地址作为参数传递给专家方法。 - 我可能错了,但我认为这是问题,因为编译器/链接器/无论看不到定义。
我想要做的就是让这些指针(对于图形设备,深度缓冲等)对多个类可见。如何实现这一目标?
答案 0 :(得分:3)
您需要在某些翻译单元中定义指针。链接器正在抱怨,因为它似乎你没有在任何地方这样做。您应该在文件范围内将它们声明为
ID3D10Device* device = NULL;
在源文件中,您调用初始化它们的DirectX函数。只需确保声明仅在一个源文件中生成,然后extern
语句应放在相关的头文件中,该文件包含在需要使用这些指针的所有翻译单元中。
答案 1 :(得分:1)
当您从外部定义这样的变量时,编译器不会为该变量保留任何内存,直到它在代码模块本身内部看到一个定义。因此,如果您要通过引用传递这些指针来初始化它们的值,则必须在某个代码模块中定义它们。
您只需要在单个代码模块中定义它们......然后将extern
声明放在您包含在需要访问指针变量的其余代码模块中的头文件中。由于重复定义,这不应该创建任何链接器错误。
答案 2 :(得分:1)
由于多个翻译单元存在问题,我无法使这些静态
如果您需要在不同的TU(翻译单位)中使用不同的变量,请将其设为static
:这样变量将特定于每个TU。
除非使用extern
,否则变量的声明也是定义。
您必须在程序中一个(且仅限一个)变量定义。
拥有全局变量:
extern
关键字声明它。extern
关键字的声明将在一个TU中定义变量。您需要在同一个TU 中包含头文件,以保证extern
声明与定义之间的一致性。答案 3 :(得分:0)
初始化这些DirectX对象的方法是传递地址 指针作为专家方法的参数
要解决这部分问题,您可以执行以下操作(在.cpp文件中):
ID3D10Device* device;
struct Foo {
Foo(ID3D10Device **pdevice) { specialist_method(pdevice); }
};
Foo f(&device);
请注意“静态初始化顺序惨败”,但使用device
中的main
或来自main
的代码是安全的,因为它肯定会在此之前初始化代码执行。从main
之前执行的其他初始化程序中使用它并不一定安全,因为在不同的翻译单元中初始化静态的顺序是未指定的(在TU中,它们按照声明或定义的顺序初始化,我忘了哪一个)。所以device
可能仍然是该代码中的空指针。同样,specialist_method
不一定依赖于已初始化的其他静态。
如果你需要强制执行初始化命令,你可以使用额外的技巧,我猜想在其他问题中已经有了所有常见的技巧。