c++ - sfml 编译错误 : NULL was not declared in this scope

标签 c++ linux compiler-errors sfml

我正在运行 Linux Mint。版本信息如下:

$ 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 中看到它.有谁知道我做错了什么和/或我可以做些什么来解决这个问题?

最佳答案

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

#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 之前,他们忘记在代码中的某处包含此 header 。只要您将它包含在它们的任何 header 之前,它就应该可以工作。

正如您自己所说,NULL 的使用可能有点令人困惑,因为它本身就是一个扩展为 0(void*) 的宏0。新标准通过引入强类型的 nullptr 来解决这个问题。在 ResourcePtr.inl 的第 31 和 148 行中将 NULL 更改为 nullptr 可能是解决问题的最佳方法。

关于c++ - sfml 编译错误 : NULL was not declared in this scope,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15457533/

相关文章:

c++ - 我可以让函数调用软编码吗?

C++ WINAPI 动态包装类

C++ 读取文件 token

Java 8 泛型类型检查

objective-c - 为什么@YES 给出 "expected expression"错误,但 @(YES) 编译?

Java 8 接口(interface)/类加载器更改?

c++ - 引用容器对象的子集

c++ - 为什么我的 C++ 代码在 Linux 上运行而不在 Windows 上运行,RAM 内存有问题吗?

linux - 需要在终端(Linux/shell 文件)中使用管道命令的帮助

c - 使用 inotify 优化程序