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)
该问题是由以下原因引起的:
#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)