Включить проблему защиты в C (компилятор по-прежнему сообщает об ошибках переопределения) - PullRequest
0 голосов
/ 22 апреля 2020

Как видно из названия, у меня возникла проблема с использованием include guard. Я не был уверен, правильно ли я их использовал, поэтому я уже проверил несколько связанных постов, и все они содержат код, который, похоже, совпадает с моим. Пожалуйста, посоветуйте мне, что не так с моим использованием include guards.

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

 #ifndef UNI_LINKED_LIST_LIB_H
 #define UNI_LINKED_LIST_LIB_H "uniLinkedListLibV02.h"
 #include UNI_LINKED_LIST_LIB_H
 #endif

Насколько я понимаю, #ifndef вернет false, если я попытаюсь включить этот заголовок более одного раза. И при первом включении он должен определить UNI_LINKED_LIST_H, а затем включить библиотеку.

Ответы [ 2 ]

4 голосов
/ 22 апреля 2020

Вот файл .h с защитой:

// guard.h -- include file with a guard

#ifndef GUARD_H
#define GUARD_H

#define SPECIAL_VALUE   23

#endif

Вот файл .c, который его использует:

// main.c -- program that includes the guarded file

#include <stdio.h>

#include "guard.h"

int
main(void)
{

    printf("%d\n",SPECIAL_VALUE);

    return 0;
}

Вот файл .c файл, который содержит файл неправильно :

// bad.c -- program that includes the guarded file _incorrectly_

#include <stdio.h>

// do _not_ do this:
#ifndef GUARD_H
#define GUARD_H
#include "guard.h"
#endif

int
main(void)
{

    printf("%d\n",SPECIAL_VALUE);

    return 0;
}
0 голосов
/ 22 апреля 2020

Это все, что вам нужно:

 #ifndef UNI_LINKED_LIST_LIB_H
 #define UNI_LINKED_LIST_LIB_H 
 #include "uniLinkedListLibV02.h"
 rest of code goes here
 #endif

Вам просто нужно определить UNI_LINKED_LIST_LIB_H, значение не имеет значения.

...