Ошибки компоновщика Arduino при использовании специального имени пространства имен

Я пытаюсь написать библиотеку Arduino.

Я поместил весь свой код в пространство имен и получил несколько ошибок компоновщика.

Странно, когда я изменил название пространства имен эти ошибки исчезли.

Мой вопрос, что может быть причиной этого? Может быть, это пространство имен уже используется какой-то другой библиотекой?

Минимальный пример:

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();
}

Все три файла находятся в одном каталоге.
Ошибка, которую я получил в этом случае:

sketch_dec13b.cpp: в функции void loop () ’:
sketch_dec13b.cpp: 155: 13: ошибка: ‘:: f’ не объявлено

Если я заменю AT24C256 на что-то другое, сборка завершается без ошибок.

Обновить:

Я случайно разместил неправильное сообщение об ошибке. Что я на самом деле получаю, это:

sketch_jan04a.cpp.o: в функции `loop ‘:
sketch_jan04a.cpp: 10: неопределенная ссылка на `(анонимное пространство имен) :: f () ‘
collect2: ld вернул 1 статус выхода

1

Решение

‘::f’ has not been declared

Это показывает нам, что вы вызываете функцию f() в глобальном масштабе. Если вы хотите использовать функцию, вы должны находиться в той же области или явно указывать область.

редактировать

Ваш заголовочный файл показывает проблему сейчас после вашего редактирования:

#ifndef AT24C256
#define AT24C256

namespace AT24C256 {

Вы используете анонимное пространство имен.

AT24C256::f() оставляет препроцессор как ::f()

1

Другие решения

О, я наконец выяснил, в чем проблема. Защитные щитки определили AT24C256, который является точно именем моего пространства имен, так что он был предварительно обработан в ничто.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector