Доступ к индексам массива с помощью макроса в C - PullRequest
0 голосов
/ 01 мая 2019

Я пытаюсь получить доступ к массиву C с помощью макроса.Массив объявляется как extern const в заголовочном файле и фактически определяется / инициализируется в исходном файле.Макрос находится в шапке.Затем я хочу получить доступ к массиву из другого файла.И другой файл, и файл, который определяет массив #include заголовок.

Я попытался получить доступ к массиву напрямую из другого файла, и он работает.Я также могу успешно использовать макрос, если массив определен в заголовке, а не в отдельном C-файле.Но мне нужно получить доступ к массиву с помощью макроса, и массив должен быть определен в отдельном исходном файле, а не в заголовке.

Это то, что у меня есть в заголовке (давайте назовем его file.h):

#define SIZE 10

#define get_arr(i)     (arr[i])

extern const uint8 arr[SIZE];

В источнике с определением массива (это file.c):

"#include file.h"

const uint8 arr[SIZE] = {0};

В другом исходном файле, который фактически хочет использовать массив:

"#include file.h"

for(uint8 i = 0; i<SIZE; i++) {
   Data[i] = get_arr(i); //Data is a pointer passed as a parameter to a function)
}

Когда я пытаюсь построить, у меня возникает проблема со связыванием: "неразрешенные символы".

1 Ответ

2 голосов
/ 01 мая 2019

У меня проблема со связыванием: "неразрешенные символы".

, если неразрешенные символы относятся к arr , что означает, что вы пропустили ссылку на файл .o

Например, имеющий:

file.h

#ifndef FILE_H
#define FILE_H

typedef unsigned char uint8;

#define SIZE 10

#define get_arr(i)     (arr[i])

extern const uint8 arr[SIZE];

#endif

file.c

#include "file.h"

const uint8 arr[SIZE] = {0};

main.c

#include "file.h"

void fill(uint8 * Data)
{
  for(uint8 i = 0; i<SIZE; i++) {
    Data[i] = get_arr(i); //Data is a pointer passed as a parameter to a function)
  }
}

int main()
{
  uint8 a[SIZE];
  fill(a);
}

Если я скомпилирую и свяжу все файлы, ошибки не возникнет:

pi@raspberrypi:/tmp $ gcc file.c main.c 
pi@raspberrypi:/tmp $ 

или

pi@raspberrypi:/tmp $ gcc -c main.c
pi@raspberrypi:/tmp $ gcc -c file.c
pi@raspberrypi:/tmp $ gcc main.o file.o
pi@raspberrypi:/tmp $ 

и т. Д.

Но еслиМне не хватает ссылки на file.o:

pi@raspberrypi:/tmp $ gcc main.c
/tmp/ccG9WO0e.o : Dans la fonction « fill » :
main.c:(.text+0x60) : référence indéfinie vers « arr »
collect2: error: ld returned 1 exit status

или

pi@raspberrypi:/tmp $ gcc -c main.c
pi@raspberrypi:/tmp $ gcc -c file.c
pi@raspberrypi:/tmp $ gcc main.o
main.o : Dans la fonction « fill » :
main.c:(.text+0x60) : référence indéfinie vers « arr »
collect2: error: ld returned 1 exit status

и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...