2016-12-22 3 views
0

ниже структура кода, где stack, Queue, tree код папки полагаться на код list папки,структура каталогов код - Библиотека дизайна

../Computing >ls 
HashTable list Queue recursion stack tree 

list папки продублированы в tree/rootedTree папке в отличие от рекомендуемого подхода включать зависимые файлы заголовков , упомянутый here,

../Computing/tree/rootedTree >ls 
lcrsImpl.c list main.c multiWalkImpl.c tree.h 

here неполный код rootedTree папка.

Во избежание дублирования в папке «Список», как сохранить структуру кода?

ответ

3

Вы, кажется, имеют следующую структуру:

whatever/ 
    list/ 
     ... 
     list.h 
    ... 
    queue/ 
     ... <- some files have an #include "list/list.h"; 
     list/ <- duplicate 
    tree/ 
     rootedTree/ 
     ... 
     list/ <- duplicate 
     tree.h <- has an #include "list/list.h"; 
     test.c <- #include "tree.h" 

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

[email protected]:~/whatever/tree/rootedTree$ gcc -Wall -I. -g *.c -o test 

Пути операторов #include относятся к тому, где вызывается компилятор от (до тех пор, пока вы включаете аргумент -I.; спасибо, @ jean-françois-fabre). Таким образом, вы можете очень хорошо иметь следующие (не дублированные) структуры:

whatever/ 
    list/ 
     ... 
     list.h 
    ... 
    queue/ 
     ... <- some files have an #include "list/list.h"; no list/ duplicate 
    tree/ 
     rootedTree/ 
     ... 
     tree.h <- has an #include "list/list.h"; no list/ duplicate 
    testTree.c <- #includes "tree/rootedTree/tree.h" and others 

и из папкинезависимо, вы можете написать

[email protected]:~/whatever$ gcc -Wall -I. -g */*.c testTree.c -o testTree 

и получить исполняемый файл для тестирования , Поскольку непосредственный вызов компилятора является скучным, особенно если вы хотите только скомпилировать части кода, где вы действительно вносили изменения, вы обычно используете какой-то файл определения проекта (Makefile, Scons, ...), чтобы обрабатывать это для вас ,

Дублирование плохое, и есть (почти) всегда способ избежать этого.

+0

Итак, как '#include" List/List.h "' работает в вашем ответе? Как препроцессор ('cpp') находит код, когда вы говорите' List/List.h'? '*/*. c' - это всего лишь код c во всех дочерних папках, но не файлы заголовков. Можете ли вы уточнить? – overexchange

+0

Когда компилятор обнаруживает #include, он пытается прочитать связанный файл из своего текущего рабочего каталога. Если я запустил gcc из 'whatever /', тогда gcc может корректно читать 'List/list.h', когда сталкивается с' #include 'List/list.h "в, например,' Tree/tree.h'. – tucuxi

+0

Но папка списка не должна находиться в папке дерева, чтобы избежать дублирования. – overexchange

Смежные вопросы