Не попадалось ли кому командно-строковой утилиты под Windows, умеющей извлекать из файла значение простого (без параметров) макроса (#define), возможно, определенного через подстановки других макросы (тоже простых)?
То есть, нужен примитивный обрубок препроцессора, умеющий рекурсивно искать #define и подставлять значения. В идеале — анализировать блоки #ifdef/#ifndef. Без арифметики, только по строкам.
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>То есть, нужен примитивный обрубок препроцессора, умеющий рекурсивно искать #define и подставлять значения. В идеале — анализировать блоки #ifdef/#ifndef. Без арифметики, только по строкам.
В такой упрощенной формулировке такую штуку можно написать, наверное, быстрее, чем задать вопрос в форум и дождаться вменяемого ответа
Но я бы, пожалуй, рассмотрел возможность пропустить файл через настоящий препроцессор, потому что требования имеют тенденцию расти, а настоящий препроцессор их всех одним разом и покроет. Неужели cl.exe не умеет останавливаться на стадии препроцессинга, выдав куда-нибудь (в файл или stdout) результат?
Re[2]: Добыть значение макроопределения C/C++ в командном файле
Здравствуйте, Pzz, Вы писали:
Pzz>В такой упрощенной формулировке такую штуку можно написать, наверное, быстрее, чем задать вопрос в форум и дождаться вменяемого ответа
Быстрее, чем написать — это весьма оптимистично, а во время ожидания можно заниматься и более насущными делами. Я как-то написал простейший парсер, но вдруг есть что-то более приличное.
Pzz>Неужели cl.exe не умеет останавливаться на стадии препроцессинга, выдав куда-нибудь (в файл или stdout) результат?
Умеет, а что с этим результатом делать?
Re: Добыть значение макроопределения C/C++ в командном файле
ЕМ>Не попадалось ли кому командно-строковой утилиты под Windows, умеющей извлекать из файла значение простого (без параметров) макроса (#define), возможно, определенного через подстановки других макросы (тоже простых)?
Эта штука работает только в окружении VS. Мне же нужно добывать из заголовков значения параметров независимо, в том числе и при отсутствии VS.
N>Еще можно за минут 10 на коленке из boost::wave утилитку сделать.
Как меня всегда умиляли такие оптимистичные оценки...
Re: Добыть значение макроопределения C/C++ в командном файле
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Не попадалось ли кому командно-строковой утилиты под Windows, умеющей извлекать из файла значение простого (без параметров) макроса (#define), возможно, определенного через подстановки других макросы (тоже простых)? ЕМ>То есть, нужен примитивный обрубок препроцессора, умеющий рекурсивно искать #define и подставлять значения. В идеале — анализировать блоки #ifdef/#ifndef. Без арифметики, только по строкам.
Возоможности указания значения дефайнов при компиляции или их зависимость параметров сборки не важна? По мне так это ключевой момент, т.е. утилита должна точно знать как именно файл будет компилироваться иначе это смысла не имеет. Я бы смотрел в сторону compilation database + опции компилятора-препроцессора.
Re[2]: Добыть значение макроопределения C/C++ в командном файле
Здравствуйте, Skorodum, Вы писали:
S>Возоможности указания значения дефайнов при компиляции или их зависимость параметров сборки не важна?
В моем применении — нет. Мне это нужно для автоматизации построения параметризованных продуктов при помощи командных файлов, чтобы не дублировать одни и те же параметры в разных местах.
Re: Добыть значение макроопределения C/C++ в командном файле
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>То есть, нужен примитивный обрубок препроцессора, умеющий рекурсивно искать #define и подставлять значения. В идеале — анализировать блоки #ifdef/#ifndef. Без арифметики, только по строкам.
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Здравствуйте, kov_serg, Вы писали:
_>>gcc -E -dM src.cpp
ЕМ>"Ну, про пар-то мне, барин, все понятно, а вот куда в этой штуке лошадь запрягать?"
Здравствуйте, Евгений Музыченко, Вы писали:
Pzz>>Неужели cl.exe не умеет останавливаться на стадии препроцессинга, выдав куда-нибудь (в файл или stdout) результат?
ЕМ>Умеет, а что с этим результатом делать?
Сначала сгенерировать файл
#include"src"int generated_unique_name;
MACRO
Пропустить через препроцессор. Все что после generated_unique_name; — должно быть оно.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[3]: Добыть значение макроопределения C/C++ в командном файле
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>В моем применении — нет. Мне это нужно для автоматизации построения параметризованных продуктов при помощи командных файлов, чтобы не дублировать одни и те же параметры в разных местах.
Звечит как обратная задача: узнать, какие используются дефайны в проекте и на основе этого настроить систему сборки?
Re[4]: Добыть значение макроопределения C/C++ в командном файле
Здравствуйте, Ops, Вы писали:
Ops>int generated_unique_name; Ops>MACRO Ops>[/ccode] Ops>Пропустить через препроцессор. Все что после generated_unique_name; — должно быть оно.
Можно. Но тогда встает обратная проблема — как из произвольного командного файла обеспечить препроцессор всеми необходимыми путями/определениями.
Re[4]: Добыть значение макроопределения C/C++ в командном файле
Здравствуйте, Skorodum, Вы писали:
S>Звечит как обратная задача: узнать, какие используются дефайны в проекте и на основе этого настроить систему сборки?
Чего их узнавать — я их сам и писал. У меня несколько десятков заголовков, каждый из которых содержит параметры для сборки определенной конфигурации проекта, некоторые из параметров нужно оттуда вынимать.
Re[5]: Добыть значение макроопределения C/C++ в командном фа
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Можно. Но тогда встает обратная проблема — как из произвольного командного файла обеспечить препроцессор всеми необходимыми путями/определениями.
Так ты сразу рабочий cpp-файл инклудь, он контекст и задаст. Будет все, что в нем подключается.
А иначе только ручками — контекст может быть только в какой-то единице трансляции, но не сам по себе.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Здравствуйте, Ops, Вы писали:
Ops>Так ты сразу рабочий cpp-файл инклудь, он контекст и задаст.
Кто такой "рабочий файл"?
Ops>А иначе только ручками — контекст может быть только в какой-то единице трансляции, но не сам по себе.
У меня все требуемые для извлечения параметры определяются или непосредственно, или через другие макросы (#define Name2 Name1), определенные в других известных файлах.
Re[7]: Добыть значение макроопределения C/C++ в командном фа
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Кто такой "рабочий файл"?
Тот, что в проекте используется, в контексте которого тебе и надо эти макросы проверять. #include "src" — это ж не обязательно заголовки, можно и любую единицу трансляции включить в этот сгенерированный файл.
ЕМ>У меня все требуемые для извлечения параметры определяются или непосредственно, или через другие макросы (#define Name2 Name1), определенные в других известных файлах.
Контекст — это еще подключаемые заголовки, где эти макросы определяются.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[5]: Добыть значение макроопределения C/C++ в командном файле
ЕМ>Вот именно эти значения и нужны. Какая разница, откуда их парсить — из этой выдачи, или из исходного .h?
Незначительная #if #ifdef и #include #pragma once комментарии, строки и т.п. придётся самому парсить.
Re[8]: Добыть значение макроопределения C/C++ в командном фа
Здравствуйте, Ops, Вы писали:
Ops>Контекст — это еще подключаемые заголовки, где эти макросы определяются.
Мне нужно доставать значения макросов не из каких-то левых проектов, а из своих собственных. Я всегда знаю, в каком заголовке что определяется. Поэтому и парсер хочу тупейший, а не полнофункциональный.