Как я пишу cpp __ DIR __ макрос, подобный __ ФАЙЛ __

У меня есть протестированные сервисы окон единицы, не тестируя сервис непосредственно, а скорее тестируя то, что делает сервис.

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

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

7
задан Brian Tompsett - 汤莱恩 8 June 2016 в 22:13
поделиться

5 ответов

Если вы используете GNU make для сборки своего проекта, вы можете сделать что-то вроде этого:

%.o: %.cpp
    $(CC) $(CFLAGS) -D__DIR__="$(strip $(lastword $(subst /, , $(dir $(abspath $<)))))" -c $< -o $@

Это должно быть примерно самая ужасная вещь, которую я думал сделать в Makefile за долгое время. Я не думаю, что вы найдете быстрый или чистый способ сделать это в рамках компилятора, поэтому я бы поискал умные способы ввести информацию в процесс компиляции.

Удачи.

тогда вы могли бы сделать что-то вроде этого:

%.o: %.cpp
    $(CC) $(CFLAGS) -D__DIR__="$(strip $(lastword $(subst /, , $(dir $(abspath $<)))))" -c $< -o $@

Это, должно быть, самое ужасное, что я думал сделать в Makefile за долгое время. Я не думаю, что вы найдете быстрый или чистый способ сделать это в рамках компилятора, поэтому я бы поискал умные способы ввести информацию в процесс компиляции.

Удачи.

тогда вы могли бы сделать что-то вроде этого:

%.o: %.cpp
    $(CC) $(CFLAGS) -D__DIR__="$(strip $(lastword $(subst /, , $(dir $(abspath $<)))))" -c $< -o $@

Это, должно быть, самая ужасная вещь, которую я думал сделать в Makefile за долгое время. Я не думаю, что вы найдете быстрый или чистый способ сделать это в рамках компилятора, поэтому я бы поискал умные способы ввести информацию в процесс компиляции.

Удачи.

9
ответ дан 6 December 2019 в 11:50
поделиться

Для этого нет встроенного макроса, но, очевидно, вы можете написать свою собственную небольшую подпрограмму синтаксического анализа, которая берет файл и вырывает имя каталога для заданного полного исправленного имени файла. Позвольте вызвать эту функцию:

extern std::string parseLastDir (const char *path);

Затем вы можете создать такой макрос:

#define __DIR__ parseLastDir (__FILE__)

, который будет вести себя как то, что вы хотите (он дает вам std :: string вместо char *, так что очистка лучше определяется ) с соответствующей семантикой (его результаты зависят от файла, в котором он был вызван, поэтому он всегда получает правильный каталог.)

4
ответ дан 6 December 2019 в 11:50
поделиться

Depending on your compiler/how your software is built, you can declare a macro to be the current or any path when you compile.

 gcc -D__DIR__=/usr/src/test/ test.c

I've never used the MS compiler but I know there is a similar option for ICC as well.

gcc manpage

2
ответ дан 6 December 2019 в 11:50
поделиться

What you want is something similar to the unix

__BASE_FILE__

Take a look around http://theory.uwinnipeg.ca/localfiles/infofiles/gcc/cpp_13.html for it. I hope this helps.

EDIT: Attempt Two

How about using the #line preprocessor command. You can use it to change the filename variable too as you can see here: http://www.cppreference.com/wiki/preprocessor/line

2
ответ дан 6 December 2019 в 11:50
поделиться

Как насчет изменения вашей make-файла / системы сборки так, чтобы для ... / bar / file.cc строка компиляции включала -D__DIR__ bar . Так должно быть проще ...

0
ответ дан 6 December 2019 в 11:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: