Добыть значение макроопределения C/C++ в командном файле
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 30.05.19 21:00
Оценка:
Не попадалось ли кому командно-строковой утилиты под Windows, умеющей извлекать из файла значение простого (без параметров) макроса (#define), возможно, определенного через подстановки других макросы (тоже простых)?

То есть, нужен примитивный обрубок препроцессора, умеющий рекурсивно искать #define и подставлять значения. В идеале — анализировать блоки #ifdef/#ifndef. Без арифметики, только по строкам.
define macro file header макро макрос файл заголовок утилита
Re: Добыть значение макроопределения C/C++ в командном файле
От: Pzz Россия https://github.com/alexpevzner
Дата: 30.05.19 21:16
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>То есть, нужен примитивный обрубок препроцессора, умеющий рекурсивно искать #define и подставлять значения. В идеале — анализировать блоки #ifdef/#ifndef. Без арифметики, только по строкам.


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

Но я бы, пожалуй, рассмотрел возможность пропустить файл через настоящий препроцессор, потому что требования имеют тенденцию расти, а настоящий препроцессор их всех одним разом и покроет. Неужели cl.exe не умеет останавливаться на стадии препроцессинга, выдав куда-нибудь (в файл или stdout) результат?
Re[2]: Добыть значение макроопределения C/C++ в командном файле
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 31.05.19 08:36
Оценка:
Здравствуйте, Pzz, Вы писали:

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


Быстрее, чем написать — это весьма оптимистично, а во время ожидания можно заниматься и более насущными делами. Я как-то написал простейший парсер, но вдруг есть что-то более приличное.

Pzz>Неужели cl.exe не умеет останавливаться на стадии препроцессинга, выдав куда-нибудь (в файл или stdout) результат?


Умеет, а что с этим результатом делать?
Re: Добыть значение макроопределения C/C++ в командном файле
От: nen777w  
Дата: 31.05.19 08:54
Оценка:
ЕМ>Не попадалось ли кому командно-строковой утилиты под Windows, умеющей извлекать из файла значение простого (без параметров) макроса (#define), возможно, определенного через подстановки других макросы (тоже простых)?

За пол. минутки нагуглился плагин под MSVC: https://marketplace.visualstudio.com/items?itemName=ASokolov.VisualMacrosExpander
Еще можно за минут 10 на коленке из boost::wave утилитку сделать.
Отредактировано 31.05.2019 8:54 nen777w . Предыдущая версия .
Re[2]: Добыть значение макроопределения C/C++ в командном файле
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 31.05.19 09:26
Оценка:
Здравствуйте, nen777w, Вы писали:

N>За пол. минутки нагуглился плагин под MSVC: https://marketplace.visualstudio.com/items?itemName=ASokolov.VisualMacrosExpander


Эта штука работает только в окружении VS. Мне же нужно добывать из заголовков значения параметров независимо, в том числе и при отсутствии VS.

N>Еще можно за минут 10 на коленке из boost::wave утилитку сделать.


Как меня всегда умиляли такие оптимистичные оценки...
Re: Добыть значение макроопределения C/C++ в командном файле
От: Skorodum Россия  
Дата: 31.05.19 09:48
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Не попадалось ли кому командно-строковой утилиты под Windows, умеющей извлекать из файла значение простого (без параметров) макроса (#define), возможно, определенного через подстановки других макросы (тоже простых)?

ЕМ>То есть, нужен примитивный обрубок препроцессора, умеющий рекурсивно искать #define и подставлять значения. В идеале — анализировать блоки #ifdef/#ifndef. Без арифметики, только по строкам.
Возоможности указания значения дефайнов при компиляции или их зависимость параметров сборки не важна? По мне так это ключевой момент, т.е. утилита должна точно знать как именно файл будет компилироваться иначе это смысла не имеет. Я бы смотрел в сторону compilation database + опции компилятора-препроцессора.
Re[2]: Добыть значение макроопределения C/C++ в командном файле
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 31.05.19 10:06
Оценка:
Здравствуйте, Skorodum, Вы писали:

S>Возоможности указания значения дефайнов при компиляции или их зависимость параметров сборки не важна?


В моем применении — нет. Мне это нужно для автоматизации построения параметризованных продуктов при помощи командных файлов, чтобы не дублировать одни и те же параметры в разных местах.
Re: Добыть значение макроопределения C/C++ в командном файле
От: kov_serg Россия  
Дата: 31.05.19 10:15
Оценка: -1
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>То есть, нужен примитивный обрубок препроцессора, умеющий рекурсивно искать #define и подставлять значения. В идеале — анализировать блоки #ifdef/#ifndef. Без арифметики, только по строкам.


gcc -E -dM src.cpp
Re[2]: Добыть значение макроопределения C/C++ в командном файле
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 31.05.19 10:28
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>gcc -E -dM src.cpp


"Ну, про пар-то мне, барин, все понятно, а вот куда в этой штуке лошадь запрягать?"
Re[3]: Добыть значение макроопределения C/C++ в командном файле
От: kov_serg Россия  
Дата: 31.05.19 10:31
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, kov_serg, Вы писали:


_>>gcc -E -dM src.cpp


ЕМ>"Ну, про пар-то мне, барин, все понятно, а вот куда в этой штуке лошадь запрягать?"


А что именно нужно?
C:\Documents and Settings\Admin\Рабочий стол>gcc -E -dM a.cpp | findstr WIN
#define _WIN32 1
#define __WINT_MAX__ 0xffff
#define __WINT_MIN__ 0
#define __WIN32 1
#define __WINNT 1
#define __WINNT__ 1
#define __WIN32__ 1
#define __SIZEOF_WINT_T__ 2
#define WIN32 1
#define __WINT_TYPE__ short unsigned int
#define __WINT_WIDTH__ 16
#define WINNT 1
Re[3]: Добыть значение макроопределения C/C++ в командном файле
От: Ops Россия  
Дата: 31.05.19 11:33
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

Pzz>>Неужели cl.exe не умеет останавливаться на стадии препроцессинга, выдав куда-нибудь (в файл или stdout) результат?


ЕМ>Умеет, а что с этим результатом делать?

Сначала сгенерировать файл
#include "src"

int generated_unique_name;
MACRO

Пропустить через препроцессор. Все что после generated_unique_name; — должно быть оно.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[3]: Добыть значение макроопределения C/C++ в командном файле
От: Skorodum Россия  
Дата: 31.05.19 11:50
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>В моем применении — нет. Мне это нужно для автоматизации построения параметризованных продуктов при помощи командных файлов, чтобы не дублировать одни и те же параметры в разных местах.

Звечит как обратная задача: узнать, какие используются дефайны в проекте и на основе этого настроить систему сборки?
Re[4]: Добыть значение макроопределения C/C++ в командном файле
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 02.06.19 14:47
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>А что именно нужно?

_>
_>C:\Documents and Settings\Admin\Рабочий стол>gcc -E -dM a.cpp | findstr WIN
_>#define _WIN32 1
_>


Вот именно эти значения и нужны. Какая разница, откуда их парсить — из этой выдачи, или из исходного .h?
Re[4]: Добыть значение макроопределения C/C++ в командном файле
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 02.06.19 14:48
Оценка:
Здравствуйте, Ops, Вы писали:

Ops>int generated_unique_name;

Ops>MACRO
Ops>[/ccode]
Ops>Пропустить через препроцессор. Все что после generated_unique_name; — должно быть оно.

Можно. Но тогда встает обратная проблема — как из произвольного командного файла обеспечить препроцессор всеми необходимыми путями/определениями.
Re[4]: Добыть значение макроопределения C/C++ в командном файле
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 02.06.19 14:50
Оценка:
Здравствуйте, Skorodum, Вы писали:

S>Звечит как обратная задача: узнать, какие используются дефайны в проекте и на основе этого настроить систему сборки?


Чего их узнавать — я их сам и писал. У меня несколько десятков заголовков, каждый из которых содержит параметры для сборки определенной конфигурации проекта, некоторые из параметров нужно оттуда вынимать.
Re[5]: Добыть значение макроопределения C/C++ в командном фа
От: Ops Россия  
Дата: 02.06.19 15:19
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Можно. Но тогда встает обратная проблема — как из произвольного командного файла обеспечить препроцессор всеми необходимыми путями/определениями.


Так ты сразу рабочий cpp-файл инклудь, он контекст и задаст. Будет все, что в нем подключается.

А иначе только ручками — контекст может быть только в какой-то единице трансляции, но не сам по себе.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Отредактировано 02.06.2019 15:24 ути-пути . Предыдущая версия .
Re[6]: Добыть значение макроопределения C/C++ в командном фа
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 02.06.19 15:26
Оценка:
Здравствуйте, Ops, Вы писали:

Ops>Так ты сразу рабочий cpp-файл инклудь, он контекст и задаст.


Кто такой "рабочий файл"?

Ops>А иначе только ручками — контекст может быть только в какой-то единице трансляции, но не сам по себе.


У меня все требуемые для извлечения параметры определяются или непосредственно, или через другие макросы (#define Name2 Name1), определенные в других известных файлах.
Re[7]: Добыть значение макроопределения C/C++ в командном фа
От: Ops Россия  
Дата: 02.06.19 15:31
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Кто такой "рабочий файл"?


Тот, что в проекте используется, в контексте которого тебе и надо эти макросы проверять. #include "src" — это ж не обязательно заголовки, можно и любую единицу трансляции включить в этот сгенерированный файл.

ЕМ>У меня все требуемые для извлечения параметры определяются или непосредственно, или через другие макросы (#define Name2 Name1), определенные в других известных файлах.


Контекст — это еще подключаемые заголовки, где эти макросы определяются.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[5]: Добыть значение макроопределения C/C++ в командном файле
От: kov_serg Россия  
Дата: 02.06.19 15:50
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, kov_serg, Вы писали:


_>>А что именно нужно?

_>>
_>>C:\Documents and Settings\Admin\Рабочий стол>gcc -E -dM a.cpp | findstr WIN
_>>#define _WIN32 1
_>>


ЕМ>Вот именно эти значения и нужны. Какая разница, откуда их парсить — из этой выдачи, или из исходного .h?

Незначительная #if #ifdef и #include #pragma once комментарии, строки и т.п. придётся самому парсить.
Re[8]: Добыть значение макроопределения C/C++ в командном фа
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 02.06.19 16:12
Оценка:
Здравствуйте, Ops, Вы писали:

Ops>Контекст — это еще подключаемые заголовки, где эти макросы определяются.


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