c ++中的extern指针问题

时间:2011-09-27 13:02:02

标签: c++ directx

我有一个头文件,其中包含许多声明:

extern ID3D10Device* device;

由于多个翻译单元的问题,我不能使这些静态,并且由于类似的原因我不能将它们作为普通指针。但是,当我尝试构建程序时,我得到了未解析的外部符号链接器错误。我假设这是因为我试图使用指针而不先定义它们。然而,这是问题,因为初始化这些DirectX对象的方法是将指针的地址作为参数传递给专家方法。 - 我可能错了,但我认为这是问题,因为编译器/链接器/无论看不到定义。

我想要做的就是让这些指针(对于图形设备,深度缓冲等)对多个类可见。如何实现这一目标?

4 个答案:

答案 0 :(得分:3)

您需要在某些翻译单元中定义指针。链接器正在抱怨,因为它似乎你没有在任何地方这样做。您应该在文件范围内将它们声明为

ID3D10Device* device = NULL;

在源文件中,您调用初始化它们的DirectX函数。只需确保声明仅在一个源文件中生成,然后extern语句应放在相关的头文件中,该文件包含在需要使用这些指针的所有翻译单元中。

答案 1 :(得分:1)

当您从外部定义这样的变量时,编译器不会为该变量保留任何内存,直到它在代码模块本身内部看到一个定义。因此,如果您要通过引用传递这些指针来初始化它们的值,则必须在某个代码模块中定义它们。

您只需要在单个代码模块中定义它们......然后将extern声明放在您包含在需要访问指针变量的其余代码模块中的头文件中。由于重复定义,这不应该创建任何链接器错误。

答案 2 :(得分:1)

  

由于多个翻译单元存在问题,我无法使这些静态

如果您需要在不同的TU(翻译单位)中使用不同的变量,请将其设为static:这样变量将特定于每个TU。

除非使用extern,否则变量的声明也是定义。

您必须在程序中一个(且仅限一个)变量定义。

拥有全局变量:

  • 在某个头文件中使用extern关键字声明它。
  • 在每个需要使用该变量的TU中包含此标头。永远不要直接声明变量,永远不要绕过标题包含。
  • 定义变量:没有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不一定依赖于已初始化的其他静态。

如果你需要强制执行初始化命令,你可以使用额外的技巧,我猜想在其他问题中已经有了所有常见的技巧。