Включить в другой файл сделать другую ошибку компиляции
У меня возникли проблемы с компиляцией кода.
ardutest.ino:
#include "mylib.h"
#include <SD.h>
void setup() {
}
void loop() {
fn();
}
mylib.h:
#ifndef mylib_h
#define mylib_h
#include "Arduino.h"
void fn(File &_file);
#endif
mylib.c:
#include "mylib.h"
void fn(File &_file)
{
_file = SD.open("LOG.TXT", FILE_WRITE);
_file.println(42);
_file.close();
}
При проверке кода в Arduino IDE у меня возникает такая ошибка:
In file included from sketch/mylib.c:1:0:
mylib.h:7: error: expected ')' before '&' token
void fn(File &_file);
^
mylib.c:3: error: expected ')' before '&' token
void fn(File &_file)
^
Multiple libraries were found for "SD.h"
Used: /home/mario/Arduino/libraries/SD
Not used: /home/mario/Programs/arduino/libraries/SD
exit status 1
expected ')' before '&' token
Но если я помещу SD.h в mylib.h (другие файлы такие же):
#ifndef mylib_h
#define mylib_h
#include "Arduino.h"
#include <SD.h>
void fn(File &_file);
#endif
У меня есть эта ошибка:
In file included from /home/user/Arduino/libraries/SD/src/utility/Sd2Card.h:26:0,
from /home/user/Arduino/libraries/SD/src/utility/SdFat.h:29,
from /home/user/Arduino/libraries/SD/src/SD.h:20,
from sketch/mylib.h:5,
from sketch/mylib.c:1:
/home/user/Arduino/libraries/SD/src/utility/Sd2PinMap.h:423:14: error: unknown type name 'pin_map_t'
static const pin_map_t digitalPinMap[] = {
^
/home/user/Arduino/libraries/SD/src/utility/Sd2PinMap.h:447:69: error: 'pin_map_t' undeclared here (not in a function)
static const uint8_t digitalPinCount = sizeof(digitalPinMap)/sizeof(pin_map_t);
^
/home/user/Arduino/libraries/SD/src/utility/Sd2PinMap.h: In function 'getPinMode':
/home/user/Arduino/libraries/SD/src/utility/Sd2PinMap.h:455:32: error: request for member 'ddr' in something not a structure or union
return (*digitalPinMap[pin].ddr >> digitalPinMap[pin].bit) & 1;
^
/home/user/Arduino/libraries/SD/src/utility/Sd2PinMap.h:455:58: error: request for member 'bit' in something not a structure or union
return (*digitalPinMap[pin].ddr >> digitalPinMap[pin].bit) & 1;
^
/home/user/Arduino/libraries/SD/src/utility/Sd2PinMap.h: In function 'setPinMode':
/home/user/Arduino/libraries/SD/src/utility/Sd2PinMap.h:464:26: error: request for member 'ddr' in something not a structure or union
*digitalPinMap[pin].ddr |= 1 << digitalPinMap[pin].bit;
^
/home/user/Arduino/libraries/SD/src/utility/Sd2PinMap.h:464:57: error: request for member 'bit' in something not a structure or union
*digitalPinMap[pin].ddr |= 1 << digitalPinMap[pin].bit;
^
/home/user/Arduino/libraries/SD/src/utility/Sd2PinMap.h:466:26: error: request for member 'ddr' in something not a structure or union
*digitalPinMap[pin].ddr &= ~(1 << digitalPinMap[pin].bit);
^
/home/user/Arduino/libraries/SD/src/utility/Sd2PinMap.h:466:59: error: request for member 'bit' in something not a structure or union
*digitalPinMap[pin].ddr &= ~(1 << digitalPinMap[pin].bit);
^
/home/user/Arduino/libraries/SD/src/utility/Sd2PinMap.h: In function 'fastDigitalRead':
/home/user/Arduino/libraries/SD/src/utility/Sd2PinMap.h:475:32: error: request for member 'pin' in something not a structure or union
return (*digitalPinMap[pin].pin >> digitalPinMap[pin].bit) & 1;
^
/home/user/Arduino/libraries/SD/src/utility/Sd2PinMap.h:475:58: error: request for member 'bit' in something not a structure or union
return (*digitalPinMap[pin].pin >> digitalPinMap[pin].bit) & 1;
^
/home/user/Arduino/libraries/SD/src/utility/Sd2PinMap.h: In function 'fastDigitalWrite':
/home/user/Arduino/libraries/SD/src/utility/Sd2PinMap.h:484:26: error: request for member 'port' in something not a structure or union
*digitalPinMap[pin].port |= 1 << digitalPinMap[pin].bit;
^
/home/user/Arduino/libraries/SD/src/utility/Sd2PinMap.h:484:58: error: request for member 'bit' in something not a structure or union
*digitalPinMap[pin].port |= 1 << digitalPinMap[pin].bit;
^
/home/user/Arduino/libraries/SD/src/utility/Sd2PinMap.h:486:26: error: request for member 'port' in something not a structure or union
*digitalPinMap[pin].port &= ~(1 << digitalPinMap[pin].bit);
^
/home/user/Arduino/libraries/SD/src/utility/Sd2PinMap.h:486:60: error: request for member 'bit' in something not a structure or union
*digitalPinMap[pin].port &= ~(1 << digitalPinMap[pin].bit);
^
In file included from /home/user/Arduino/libraries/SD/src/utility/SdFat.h:29:0,
from /home/user/Arduino/libraries/SD/src/SD.h:20,
from sketch/mylib.h:5,
Multiple libraries were found for "SD.h"
Used: /home/user/Arduino/libraries/SD
Not used: /home/user/Programs/arduino/libraries/SD
from sketch/mylib.c:1:
/home/user/Arduino/libraries/SD/src/utility/Sd2Card.h: At top level:
/home/user/Arduino/libraries/SD/src/utility/Sd2Card.h:70:1: error: initializer element is not constant
uint8_t const SD_CHIP_SELECT_PIN = SS;
^
/home/user/Arduino/libraries/SD/src/utility/Sd2Card.h:79:1: error: initializer element is not constant
uint8_t const SPI_MOSI_PIN = MOSI;
^
/home/user/Arduino/libraries/SD/src/utility/Sd2Card.h:81:1: error: initializer element is not constant
uint8_t const SPI_MISO_PIN = MISO;
^
/home/user/Arduino/libraries/SD/src/utility/Sd2Card.h:83:1: error: initializer element is not constant
uint8_t const SPI_SCK_PIN = SCK;
^
/home/user/Arduino/libraries/SD/src/utility/Sd2Card.h:176:1: error: unknown type name 'class'
class Sd2Card {
^
/home/user/Arduino/libraries/SD/src/utility/Sd2Card.h:176:15: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
class Sd2Card {
^
In file included from /home/user/Arduino/libraries/SD/src/utility/SdFat.h:30:0,
from /home/user/Arduino/libraries/SD/src/SD.h:20,
from sketch/mylib.h:5,
from sketch/mylib.c:1:
/home/user/Arduino/libraries/SD/src/utility/FatStructs.h:405:1: error: initializer element is not constant
uint8_t const DIR_ATT_FILE_TYPE_MASK = (DIR_ATT_VOLUME_ID | DIR_ATT_DIRECTORY);
^
In file included from /home/user/.arduino15/packages/arduino/hardware/avr/1.6.21/cores/arduino/Print.h:27:0,
from /home/user/Arduino/libraries/SD/src/utility/SdFat.h:31,
from /home/user/Arduino/libraries/SD/src/SD.h:20,
from sketch/mylib.h:5,
from sketch/mylib.c:1:
/home/user/.arduino15/packages/arduino/hardware/avr/1.6.21/cores/arduino/Printable.h:25:1: error: unknown type name 'class'
class Print;
^
/home/user/.arduino15/packages/arduino/hardware/avr/1.6.21/cores/arduino/Printable.h:33:1: error: unknown type name 'class'
class Printable
^
/home/user/.arduino15/packages/arduino/hardware/avr/1.6.21/cores/arduino/Printable.h:34:1: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
{
^
In file included from /home/user/Arduino/libraries/SD/src/utility/SdFat.h:31:0,
from /home/user/Arduino/libraries/SD/src/SD.h:20,
from sketch/mylib.h:5,
from sketch/mylib.c:1:
/home/user/.arduino15/packages/arduino/hardware/avr/1.6.21/cores/arduino/Print.h:37:1: error: unknown type name 'class'
class Print
^
/home/user/.arduino15/packages/arduino/hardware/avr/1.6.21/cores/arduino/Print.h:38:1: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
{
^
In file included from /home/user/Arduino/libraries/SD/src/SD.h:20:0,
from sketch/mylib.h:5,
from sketch/mylib.c:1:
/home/user/Arduino/libraries/SD/src/utility/SdFat.h:39:1: error: unknown type name 'class'
class SdVolume;
^
/home/user/Arduino/libraries/SD/src/utility/SdFat.h:55:1: error: initializer element is not constant
uint8_t const O_RDONLY = O_READ;
^
/home/user/Arduino/libraries/SD/src/utility/SdFat.h:59:1: error: initializer element is not constant
uint8_t const O_WRONLY = O_WRITE;
^
/home/user/Arduino/libraries/SD/src/utility/SdFat.h:61:1: error: initializer element is not constant
uint8_t const O_RDWR = (O_READ | O_WRITE);
^
/home/user/Arduino/libraries/SD/src/utility/SdFat.h:63:1: error: initializer element is not constant
uint8_t const O_ACCMODE = (O_READ | O_WRITE);
^
/home/user/Arduino/libraries/SD/src/utility/SdFat.h:94:1: error: initializer element is not constant
uint8_t const FAT_FILE_TYPE_MIN_DIR = FAT_FILE_TYPE_ROOT16;
^
/home/user/Arduino/libraries/SD/src/utility/SdFat.h:137:1: error: unknown type name 'class'
class SdFile : public Print {
^
/home/user/Arduino/libraries/SD/src/utility/SdFat.h:137:14: error: expected '=', ',', ';', 'asm' or '__attribute__' before ':' token
class SdFile : public Print {
^
/home/user/Arduino/libraries/SD/src/utility/SdFat.h:431:1: error: unknown type name 'class'
class SdVolume {
^
/home/user/Arduino/libraries/SD/src/utility/SdFat.h:431:16: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
class SdVolume {
^
In file included from /home/user/Arduino/libraries/SD/src/SD.h:21:0,
from sketch/mylib.h:5,
from sketch/mylib.c:1:
/home/user/Arduino/libraries/SD/src/utility/SdFatUtil.h: In function 'FreeRam':
/home/user/Arduino/libraries/SD/src/utility/SdFatUtil.h:43:7: error: 'reinterpret_cast' undeclared (first use in this function)
if (reinterpret_cast<int>(__brkval) == 0) {
^
/home/user/Arduino/libraries/SD/src/utility/SdFatUtil.h:43:7: note: each undeclared identifier is reported only once for each function it appears in
/home/user/Arduino/libraries/SD/src/utility/SdFatUtil.h:43:24: error: expected expression before 'int'
if (reinterpret_cast<int>(__brkval) == 0) {
^
/home/user/Arduino/libraries/SD/src/utility/SdFatUtil.h:45:36: error: expected expression before 'int'
free_memory = reinterpret_cast<int>(&free_memory)
^
/home/user/Arduino/libraries/SD/src/utility/SdFatUtil.h:49:36: error: expected expression before 'int'
free_memory = reinterpret_cast<int>(&free_memory)
^
/home/user/Arduino/libraries/SD/src/utility/SdFatUtil.h: In function 'SerialPrint_P':
/home/user/Arduino/libraries/SD/src/utility/SdFatUtil.h:62:52: error: 'Serial' undeclared (first use in this function)
for (uint8_t c; (c = pgm_read_byte(str)); str++) Serial.write(c);
^
/home/user/Arduino/libraries/SD/src/utility/SdFatUtil.h: In function 'SerialPrintln_P':
/home/user/Arduino/libraries/SD/src/utility/SdFatUtil.h:72:3: error: 'Serial' undeclared (first use in this function)
Serial.println();
^
In file included from sketch/mylib.h:5:0,
from sketch/mylib.c:1:
/home/user/Arduino/libraries/SD/src/SD.h: At top level:
/home/user/Arduino/libraries/SD/src/SD.h:26:1: error: unknown type name 'namespace'
namespace SDLib {
^
/home/user/Arduino/libraries/SD/src/SD.h:26:17: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
namespace SDLib {
^
/home/user/Arduino/libraries/SD/src/SD.h:119:1: error: unknown type name 'using'
using namespace SDLib;
^
/home/user/Arduino/libraries/SD/src/SD.h:119:17: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'SDLib'
using namespace SDLib;
^
/home/user/Arduino/libraries/SD/src/SD.h:123:14: error: expected '=', ',', ';', 'asm' or '__attribute__' before ':' token
typedef SDLib::File SDFile;
^
/home/user/Arduino/libraries/SD/src/SD.h:124:14: error: expected '=', ',', ';', 'asm' or '__attribute__' before ':' token
typedef SDLib::SDClass SDFileSystemClass;
^
In file included from sketch/mylib.c:1:0:
mylib.h:7: error: expected ')' before '&' token
void fn(File &_file);
^
mylib.c:3: error: expected ')' before '&' token
void fn(File &_file)
^
exit status 1
expected ')' before '&' token
Если я использую функцию SD.h в mylib, мне это нужно в файле mylib.h. Почему это происходит?
Первая ошибка заключается в передаче объекта в качестве аргумента функции. Я следую примеру, который я нашел в других форумах, то я не знаю, почему это не работает.
[РЕШЕНО] Я переименую mylib.c в mylib.cpp и решил проблему.
@Mario J., 👍1
Обсуждение2 ответа
SD.h определяет файл класса
. Без этого определения "Файл" принимается за имя нетипизированного аргумента (который будет считаться значением int). Учитывая это предположение, '&_file' является неожиданным.
Во-первых, существуют различные стратегии организации структуры заголовочных файлов. Я не знаю, какому из них ты следуешь. В рамках популярного подхода, который стремится поддерживать все заголовочные файлы в самодостаточном состоянии, mylib.h
должен включать <SD.h><SD.h>
, так как mylib.h
использует Тип файла.
Во-вторых, когда вы фактически включили <SD.h><SD.h>
в mylib.h
, вы столкнулись с другой проблемой. Библиотека SD написана как библиотека C++. Его заголовочные файлы не будут компилироваться как код на языке Си. Тем временем вы пытаетесь скомпилировать <SD.h><SD.h>
в режиме C, косвенно включив его в файл mylib.c
, что и вызывает ошибки.
Файлы заголовков этой библиотеки содержат множество причудливых шаблонов кодирования, которые могут создать впечатление, будто кто-то пытается сделать эти заголовки совместимыми с кодом C (статический const
? статический встроенный
? И т.д.), но это иллюзия. Код исключительно на C++, а не на C.
- Недопустимое преобразование из 'char' в 'const char*' [-fpermissive] в строке
- Ошибка компиляции для платы Arduino Nano
- Ошибка компиляции для любой платы arduino ide 1.8.9
- Что мне делать с StackOverflow при ошибке компиляции?
- UECIDE: ошибка компоновщика с библиотекой U8g2
- Не удалось скомпилировать библиотеки c++11, несмотря на добавление-std=c++11 в platform.txt
- Как записать выходные данные компилятора в текстовый файл в Windows?
- pubsubclient не будет компилироваться в IDE Arduino и VSCode
в первом случае у вас есть SD.h, включенный после mylib.h, так что файл не известен, @Juraj