Проблемы с #define в #include

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Открываем K&R на 220 странице.
Читаем:

Цитата:

Если имеется определение

#define tempfile(dir) #dir "/%s"

то макровызов tempfile(/usr/tmp) даст в результате

"/usr/tmp" "/%s"

Далее эти две строки превратятся в одну строку.

Как работает конкатенация и символ #, описано на стр. 90:

Цитата:

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

#define dprint(expr) printf(#expr " = %g\n", expr)

Обращение к

dprint(x/y);

развернется в

printf("x/y" " = %g\n", x/y);

а в результате конкатенации двух соседних строк получим

printf("x/y = %g\n", x/y);

Внутри фактического аргумента каждый знак " заменяется на \", а каждая \ на \\, так что результат
подстановки приводит к правильной символьной константе.

Определяем:

#define MY_PATH(fname) = "F:\Arduino\Sketches\Synt_2560_05\" #fname

Вызываем:

#include MY_PATH(int_check_new_note.d)

Имеем:

Synt_2560_05.ino:107:38: error: #include expects "FILENAME" or <FILENAME>

чяднт?

PS. Обратные слеши и удваивал, и разворачивал (делал прямыми) - результат не меняется.
Хоть бы, гад, писал строку, которая у него получается, а то приходится гадать вслепую, что ему не нравится.

PPS. И брать включаемые файлы с расширением .d соглашается только с полными путями.

Клапауций 234
Offline
Зарегистрирован: 24.10.2016

andriano пишет:

Открываем K&R на 220 странице.
Читаем:

вот так прямо берём и открываем на странице?

Клапауций 234
Offline
Зарегистрирован: 24.10.2016

andriano пишет:

Открываем K&R на 220 странице.
Читаем:

вот так прямо берём и открываем на странице?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

вот так прямо берём и открываем

вот так прямо берём и открываем

ptr
Offline
Зарегистрирован: 28.05.2016
#define MY_PATH_STRINGIFY(fname) #fname
#define MY_PATH(fname) MY_PATH_STRINGIFY(C:\Temp\C\fname)
#include MY_PATH(test.h)

 

ptr
Offline
Зарегистрирован: 28.05.2016

А проблема в том, что контактенацией строковых литералов занимается не препроцессор, а компилятор, до которого #include не доходит

ptr
Offline
Зарегистрирован: 28.05.2016

Ау! Получилось?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Спасибо, работает.

 

PS. define - мощное средатво, но уж слишком много всяких особенносей, приводящих обычно к необходимости определения дополнительных сущностей (бедный Оккам).