C++ g++;“如何解决警告”;“已使用但从未定义”;?(非静态或内联)

C++ g++;“如何解决警告”;“已使用但从未定义”;?(非静态或内联),c++,namespaces,g++,C++,Namespaces,G++,我遇到了一个奇怪的编译错误,我无法理解。首先,该错误将函数视为在匿名名称空间中,但实际上它位于名称空间数据库中。其次,“used but never defined”语句表明编译需要我从头中定义函数。该函数实际上是在一个单独的实现文件中声明的。但是,该函数既不是静态的,也不是内联的,所以我不知道为什么它需要在头中定义。这段代码必须严格符合要求,因此我使用-Wall-Werror编译了这段代码。我还包括了我的源代码的一个简短版本以供澄清 注意:此问题与此处提出的其他类似问题不同,因为它不涉及静态或

我遇到了一个奇怪的编译错误,我无法理解。首先,该错误将函数视为在匿名名称空间中,但实际上它位于
名称空间数据库
中。其次,“used but never defined”语句表明编译需要我从头中定义函数。该函数实际上是在一个单独的实现文件中声明的。但是,该函数既不是静态的,也不是内联的,所以我不知道为什么它需要在头中定义。这段代码必须严格符合要求,因此我使用
-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;
}
#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
#包括
#包括“config.hpp”
#包括“database.hpp”
int main(){
数据库::设置设置();
返回0;
}
数据库.hpp

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

int main() {
  database::SetupSettings();
  return 0;
}
#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
#ifndef数据库
#定义数据库
#包括
#包括“config.hpp”
#包括“sqlite/sqlite3.h”
名称空间数据库{
外部sqlite3*设置_数据库;
void SetupSettings();
//这里有明显的警告。
}//名称空间数据库
#恩迪夫
数据库。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
#包括
#包括
#包括“config.hpp”
#包括“database.hpp”
#包括“sqlite/sqlite3.h”
名称空间数据库{
sqlite3*设置_数据库;
void SetupSettings(){/*此处有更多代码*/}
}//名称空间数据库

该问题是由使用以下部件引起的:

#ifndef database
#define database
此后,

namespace database { ...
被视为

namespace { ...
i、 e.匿名名称空间

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

#ifndef database_hpp
#define database_hpp

该问题是由使用以下设备引起的:

#ifndef database
#define database
此后,

namespace database { ...
被视为

namespace { ...
i、 e.匿名名称空间

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

#ifndef database_hpp
#define database_hpp