2013-03-17 67 views
3

我正在运行Linux Mint。版本信息如下:sfml编译错误:NULL未在此范围内声明

$ cat /etc/*-release 
DISTRIB_ID=LinuxMint 
DISTRIB_RELEASE=12 
DISTRIB_CODENAME=lisa 
DISTRIB_DESCRIPTION="Linux Mint 12 Lisa" 

我试图编译和链接文件使用SFML C++程序。当试图编译文件,我得到以下错误:

$g++ -c lineTest.cpp Rasterizer.cpp simpleCanvas.cpp 
In file included from /usr/local/include/SFML/System/Resource.hpp:211:0, 
      from /usr/local/include/SFML/Graphics/Image.hpp:31, 
      from simpleCanvas.h:13, 
      from simpleCanvas.cpp:9: 
/usr/local/include/SFML/System/ResourcePtr.inl: 
In constructor ‘sf::ResourcePtr< <template-parameter-1-1> >::ResourcePtr()’: 
/usr/local/include/SFML/System/ResourcePtr.inl:31:12: 
error: ‘NULL’ was not declared in this scope 
/usr/local/include/SFML/System/ResourcePtr.inl: In member function ‘void sf::ResourcePtr< <template-parameter-1-1> >::OnResourceDestroyed()’: 
/usr/local/include/SFML/System/ResourcePtr.inl:148:18: error: ‘NULL’ was not declared in this scope 

这似乎也与在文件ResourcePtr.inl使用“NULL”的问题。就个人而言,我通常不会使用这个关键字,而是使用0,但是当我在我自己甚至没有写的包文件中使用它时,我能做些什么?此外,没有我的管理员权限,我将无法编辑文件来纠正它,但我使用sudo编辑它并添加了#include <cstddef>。这就打开了闸门,出现了一些类似问题,其中“未定义”或者某个关键字或类型未被识别(该列表对于我来说这里太长了)。这似乎表明图书馆缺少某些东西。最初设置库时遇到了一些麻烦,所以我意识到我可能没有正确完成它。你可以在this question here看到它。有谁知道我做错了什么和/或我能做些什么来解决这个问题?

回答

2

此代码无法编译,并显示您所描述的错误:

#include <SFML/Graphics/Image.hpp> 
int main() 
{ 
    return 0; 
} 

输出是:

In file included from ./include/SFML/System/Resource.hpp:211:0, 
       from ./include/SFML/Graphics/Image.hpp:31, 
       from test.cpp:1: 
./include/SFML/System/ResourcePtr.inl: In constructor ‘sf::ResourcePtr< <template-parameter-1-1> >::ResourcePtr()’: 
./include/SFML/System/ResourcePtr.inl:31:12: error: ‘NULL’ was not declared in this scope 
./include/SFML/System/ResourcePtr.inl: In member function ‘void sf::ResourcePtr< <template-parameter-1-1> >::OnResourceDestroyed()’: 
./include/SFML/System/ResourcePtr.inl:148:18: error: ‘NULL’ was not declared in this scope 

幸运的是,修复很容易,这个工程:

#include <SFML/System.hpp> 
#include <SFML/Graphics/Image.hpp> 
int main() 
{ 
    return 0; 
} 

它看起来像这样:

#include <cstddef> 
#include <SFML/Graphics/Image.hpp> 
int main() 
{ 
    return 0; 
} 

在使用NULL之前,他们忘记在代码的某个地方包含此标头。只要你在他们的任何头文件中包含它,它就可以工作。

正如你所说,使用NULL可能有点混乱,因为它本身是一个扩展到0(void*)0的宏。新标准通过引入强烈类型的nullptr来解决这个问题。在ResourcePtr.inl的第31行和第148行中更改NULLnullptr可能是解决此问题的最佳方法。

+0

值得注意的是,'(void *)0'是C中'NULL'的常用定义,但在C++中不能如此。在C++ 98中,它必须是值为0的整数常量,例如“0”或“0L”。 – rodrigo 2013-03-20 00:35:51