У меня есть файл заголовка, "temp.h" и несколько файлов ".c", в каждом из которых есть операторы заголовка "#include <temp.h>". И я определяю глобальный массив статических символов в файле «temp.h» следующим образом:
темп.ч
static char buffer[1000] = {'A','B','C','\0'};
main.c
...
#include <temp.h>
int main()
{
strcpy(buffer,"xyz");
printf("\nBuffer : %s",buffer);
func();
return 0;
}
другое.с
...
#include <temp.h>
int func()
{
printf("\nInside func(), buffer : %s",buffer);
return 0;
}
и я компилирую все файлы с помощью следующей команды:
gcc -o output.o main.c other.c
И я не получаю ошибок... и когда запускаю программу "output.o", Я ожидаю такого результата:
Buffer : xyz // Buffer was intentionally changed inside main
Inside func(), buffer : xyz
но я получаю:
Buffer : xyz // Buffer was intentionally changed inside main
Inside func(), buffer : ABC // doesn't get updated buffer content- why?
Почему, когда я изменяю содержимое «(предположительно) глобального» статического массива символов в одном файле внутри любой области действия (основной или любой другой), это изменение не отражается на всех будущих ссылках этого массива символов из любого другого файла позже, а вместо этого в каждом файле((а может внутри в каждой функции) сохраняется его содержимое??
Как сделать так, чтобы я мог использовать определенную часть массива символов (область памяти), которая ГЛОБАЛЬНО доступна из всех «файлов» и в их функциях, и все ссылки получают правильные показания?
спасибо
@chux-ReinstateMonica, но если я удалю статическое ключевое слово, я получаю такую ошибку для каждого файла или каждой функции, которые ссылаются на эту переменную. /usr/bin/ld: /tmp/cc3GK74t.o:(.data+0x0): multiple definition of `buffer'; /tmp/cc9HtEQv.o:(.data+0x0): first defined here collect2: error: ld returned 1 exit status
совет: не объявляйте данные в файлах заголовков. Скорее объявите «внешний тип dataName». Затем поместите фактическое объявление данных в один (только один) из файлов *.c.
С вашим текущим подходом у вас есть две копии массива. Вместо этого вам нужно объявить массив в temp.h
(с extern вместо static) и определить его в другом месте, например, в in temp.c
:
темп.ч:
#ifndef TEMP_H
#define TEMP_H
extern char buffer[1000];
#endif
темп.с:
#include "temp.h"
char buffer[1000] = "ABC";
Вы также можете найти для модуля более описательное имя, чем temp. Также рекомендуется добавить префикс к переменной буфера, например. temp_buffer, чтобы избежать возможных конфликтов имен и облегчить себе и другим поиск места объявления массива.
При замене ключевого слова static на extern... Получил еще больше ошибок и предупреждений, таких как: ` предупреждение: формат '%s' ожидает соответствующий аргумент 'char *' [-Wformat=] 560 | fprintf(stderr, "%s буфер здесь:%s \n",buffer );| /usr/bin/ld: /tmp/cckjaWGL.o: в функции 'main': temp.c:(.text+0x26a): неопределенная ссылка на 'buffer' collect2: ошибка: ld вернул 1 статус выхода`
@mikkins Если у вас есть два %s
в строке формата, вам нужно указать две строки после строки формата.
%s->%n была моей опечаткой... ВСЕ ТАКИЕ ОШИБКИ, даже такое же предупреждение о несоответствии буфера как char*....
Хорошо ... ПОНЯЛ! ... теперь я решил!
В отдельно включенном заголовочном файле ((о котором идет речь temp.h)) вы должны написать:
extern char buffer[];
Примечание: однократное включение этого файла temp.h может быть достигнуто с помощью пар "#ifndef-#endif" в других файлах ".c" и ".h" компиляции.
И далее включите только в один из файлов следующее определение определения:
char buffer[1000];
Я надеюсь, что это решение поможет некоторым ребятам.
Есть 2 разных
buffer[]
как они естьstatic
. Изменение одного не меняет другого. Не используйтеstatic
, если вам нужен только 1buffer[]
.