Я пытаюсь написать библиотеку 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 статус выхода
‘::f’ has not been declared
Это показывает нам, что вы вызываете функцию f()
в глобальном масштабе. Если вы хотите использовать функцию, вы должны находиться в той же области или явно указывать область.
редактировать
Ваш заголовочный файл показывает проблему сейчас после вашего редактирования:
#ifndef AT24C256
#define AT24C256
namespace AT24C256 {
Вы используете анонимное пространство имен.
AT24C256::f()
оставляет препроцессор как ::f()
О, я наконец выяснил, в чем проблема. Защитные щитки определили AT24C256, который является точно именем моего пространства имен, так что он был предварительно обработан в ничто.