使用 SFML 在 C++ 中错误缺少声明

Werror missing declarations in C++ with SFML

我正在使用带有 SFML 库的 C++ 制作游戏,主要是我创建了几个函数。我知道在 main 中这样做是一种不好的方式,但是是的。当我尝试编译代码时出现错误:

src/main.cpp: In function 'void create_platforms(std::vector<std::unique_ptr<sf::Sprite> >&)':
src/main.cpp:12:6: error: no previous declaration for 'void create_platforms(std::vector<std::unique_ptr<sf::Sprite> >&)' [-Werror=missing-declarations]
 void create_platforms(std::vector<std::unique_ptr<sf::Sprite>>& platforms)
      ^~~~~~~~~~~~~~~~src/Player.cpp:
 In member function 'void Player::gravity(sf::Time&, sf::FloatRect&)':

create_items 和 create_interface 也是如此。我没有为 main.cpp 使用任何头文件,我可以只在 main.cpp 中声明它们吗?如果是这样,如果有人能帮助我如何去做,我会很高兴。

void create_platforms(std::vector<std::unique_ptr<sf::Sprite>>& platforms)
{
    [...]
}

void create_items(std::vector<std::unique_ptr<sf::Sprite>>& healing_items)
{
    auto small_heart = std::make_unique<sf::Sprite>();
    small_heart->setTexture(*TextureManager::getTexture("heart"));
    small_heart->setPosition(320, 180);
    small_heart->setScale(0.4, 0.4);
    healing_items.emplace_back(std::move(small_heart));
}

void create_interface(std::vector<std::unique_ptr<sf::Sprite>>& interface)
{
    auto life = std::make_unique<sf::Sprite>();`enter code here`
    life->setTexture(*TextureManager::getTexture("life"));
    life->setPosition(10, 530);
    interface.emplace_back(std::move(life));
}

int main()
{
    [...]
}

can I just declare those in main.cpp?

技术上是的。 -Wmissing-declarations 选项重要的是声明在定义之前。您放置声明的文件无关紧要。

但是请注意,这可能违背警告的精神。当您同时不想使用 header.

时,为什么要收到有关缺少声明的警告尚不清楚

如果该函数打算仅在该翻译单元中使用,那么您应该在匿名命名空间中声明它。 -Wmissing-declarations 不会对匿名命名空间中的函数发出警告。