g++如何解决警告"used but never defined"? (不是静态的或内联的)

g++ how to solve warning "used but never defined"? (not static or inline)

我遇到了一个我无法理解的奇怪的编译错误。首先,错误引用该函数,就好像它在匿名命名空间中一样,但实际上它在 namespace database 中。其次,"used but never defined" 语句表明编译需要我从 header 中定义函数。该函数实际上是在单独的实现文件中声明的。但是该函数既不是静态的也不是内联的,所以我不知道为什么它需要在 header 中定义。要求这段代码严格遵守,因此我编译了-Wall -Werror。我还包含了我的源代码的简化版本以供澄清。

注意:这个问题与这里问的其他类似问题不同,它不涉及静态或内联函数。

错误:

In file included from src/main.cpp:6:0:
include/database.hpp:19:6: error: 'void {anonymous}::SetupSettings()' used but never defined [-Werror]
 void SetupSettings();
      ^
cc1plus.exe: all warnings being treated as errors

main.cpp

#include <iostream>
#include "config.hpp"
#include "database.hpp"

int main() {
  database::SetupSettings();
  return 0;
}

database.hpp

#ifndef database
#define database
#include <iostream>
#include "config.hpp"
#include "sqlite/sqlite3.h"

namespace database {
extern sqlite3* settings_database;

void SetupSettings();
//   ^^ Apparent warning here.
}  // namespace database
#endif

database.cpp:

#include <iostream>
#include <vector>
#include "config.hpp"
#include "database.hpp"
#include "sqlite/sqlite3.h"

namespace database {
sqlite3* settings_database;

void SetupSettings() {/*More code here*/}
}  // namespace database

问题是由于使用:

#ifndef database
#define database

之后,

namespace database { ...

被视为

namespace { ...

即匿名命名空间。

您需要使用不同的 include guard 宏,例如:

#ifndef database_hpp
#define database_hpp