我正在尝试编写Arduino库。

我已将所有代码放入命名空间中,并遇到了一些链接器错误。

奇怪的是,当我更改命名空间的名称时,这些错误消失了。

我的问题是这可能是什么原因?可能是其他库已经使用了该 namespace 吗?

最小示例:

at24c256.h

#ifndef AT24C256
#define AT24C256

namespace AT24C256 {
  int f();
}

#endif

at24c256.cpp
#include "at24c256.h"

namespace AT24C256 {
  int f() {return 42;}
}

然后在草图中,我只调用AT24C256::f()
#include "at24c256.h"

void setup() {
}

void loop() {
    AT24C256::f();
}

所有三个文件都在同一目录中。
我在这种情况下得到的错误是:



如果我将AT24C256更改为其他格式,则构建将完成且没有错误。

更新:

我不小心发布了错误的错误消息。我实际上得到的是:

最佳答案

‘::f’ has not been declared

这表明我们在全局范围内调用了f()函数。当您要使用该函数时,您必须在同一范围内或显式指定范围。

编辑

编辑后,头文件现在显示问题:
#ifndef AT24C256
#define AT24C256

namespace AT24C256 {

您正在使用匿名 namespace 。
AT24C256::f()将预处理器保留为::f()

10-08 06:51