2013-01-20 22 views
2

我用#pragma once经常和它似乎做工精细用头和但由于某些原因打交道时,以下代码创建的多个定义链接器错误:的#pragma一次并不妨碍多变量定义

#pragma once 
int someVariable=5; 

pragma也不应该这样做吗?

+2

#pragma曾用于标题中。不要在头文件中定义一个变量!只是宣布它。 #pragma一次只能防止它被同一个文件多次包含,但不能被总共多次(例如,可以被两个不同的文件包含两次)。 – thang

+4

它避免了头部的内容被包含在同一个TU中,而不是跨越TU。通过在标题中定义变量来打破ODR。 –

回答

5

该编译指示不应该阻止这个吗?

不,在这种情况下,如果此头文件包含在多个位置,则会创建someVariable的多个定义。如果B.h和C.h都包含头文件,则会创建两个someVariable。

更好的办法是只在一个.cpp文件中定义变量,并在其他地方使用extern

+2

这有点误导人;如果B.h和C.h在同一个翻译单元中,你仍然只能获得原始头文件的一个副本。问题是当2个cop文件包含它并且它们都在它们的目标文件中时。 –