Положение заголовочных файлов C - PullRequest
1 голос
/ 22 декабря 2010

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

По какой причине?Прошу прощения, новичок здесь.

Ответы [ 3 ]

4 голосов
/ 22 декабря 2010

Проблема в том, что импорт заголовков в C и C ++ - это, по сути, вставка кода, похожая на макрос, в ту точку компилируемого файла.

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

3 голосов
/ 22 декабря 2010

Недостаточно информации;Я бы посоветовал скомпилировать множество предупреждений (например, -Wall при использовании gcc) и обратить на них внимание.Например, вы могли бы переопределить некоторый тип, например, структуру, с другим размером и повреждением памяти.Предполагая, что «ошибка без ошибок», вы имеете в виду сбой.В предупреждении будет указано, что вы что-то переопределяете.

Всегда обращайте внимание на все предупреждения компилятора.

0 голосов
/ 22 декабря 2010

Это зависит от того, где ваш компилятор обучен проверять их. В большинстве типичных систем Linux, если вы делаете это:

#include <stdio.h>

Компилятор предположит, что вы имели в виду:

#include </usr/include/stdio.h>

Принимая во внимание, что если вы напечатаете:

#include "config.h"

И config.h отсутствует в текущем каталоге, и вы не научили компилятор (через переключатель -I на моем компиляторе) искать его в другом месте, он не сможет его найти.

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

Возможно, стоит потратить некоторое время на изучение документации вашего компилятора, хотя бы для того, чтобы узнать больше интересных вещей, которые он может сделать:)

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

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