Проблемы с #define в #include
- Войдите на сайт для отправки комментариев
Открываем 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 соглашается только с полными путями.
Открываем K&R на 220 странице.
Читаем:
вот так прямо берём и открываем на странице?
Открываем K&R на 220 странице.
Читаем:
вот так прямо берём и открываем на странице?
вот так прямо берём и открываем
вот так прямо берём и открываем
А проблема в том, что контактенацией строковых литералов занимается не препроцессор, а компилятор, до которого #include не доходит
Ау! Получилось?
Спасибо, работает.
PS. define - мощное средатво, но уж слишком много всяких особенносей, приводящих обычно к необходимости определения дополнительных сущностей (бедный Оккам).