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

sil*_*asp 0 c++ namespaces g++

我遇到了一个我无法理解的奇怪的编译错误。首先,错误将函数引用为该函数,就好像该函数位于匿名名称空间中一样,但实际上是在内部namespace database。其次,“已使用但从未定义”语句表明编译要求我从头文件中定义函数。该函数实际上是在单独的实现文件中声明的。但是该函数既不是静态的也不是内联的,所以我对为什么它需要在标头中定义感到困惑。这段代码是严格符合要求的,因此我已经使用二者进行了编译-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
Run Code Online (Sandbox Code Playgroud)

main.cpp

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

int main() {
  database::SetupSettings();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

数据库.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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

R S*_*ahu 5

该问题是由以下原因引起的:

#ifndef database
#define database
Run Code Online (Sandbox Code Playgroud)

之后,

namespace database { ...
Run Code Online (Sandbox Code Playgroud)

被视为

namespace { ...
Run Code Online (Sandbox Code Playgroud)

即一个匿名名称空间。

您需要使用其他包含保护宏,例如:

#ifndef database_hpp
#define database_hpp
Run Code Online (Sandbox Code Playgroud)