Вы предлагаете создать отдельную версию макроса перевода строки для каждого случая. Но тогда решение не будет универсальным, потому что оно зависит от типа макроса.
Получается, что общего механизма перевода макроса в строку не существует.
Следите за вложенными вызовами макросов. Параметры макросов, которые сами являются макросами, расширяются на 2 этапа;
voidfunc(intarg) { }
func(MACROS1);
если arg - макрос, то он будет полностью расширен (т. е. оценен, или произойдет текстовая замена) во время компилятора/парсера.
I don't consider it a solution using pure macros. Using a helper function like StringSubst() or Print() that is evaluated at runtime can help to escape the default order of macro parameter expansion (2 steps). These are the semantics of how the C compiler works.
Stringifying the args can be helpful for displaying debug messages. But in order to keep the meaning of args (work on them), you have to use other indirection macros.
FYI, comments are removed by the parser from the source code file before any macro is expanded, so comments inside macros are deleted.
Как сделать так, чтобы и при вызове функции в коде тоже происходило очищение?
Если окно экспертов пустое, кнопка Очистить не нажимается.
Может возможно добавить проверку того, нажимается она или нет, и если нажимается, очищать, пока не станет ненажимаемой?
Возможно ли в этом месте вывести полностью MACROS2: Num2,Num3?
Можно ли в этот момент вывести полностью MACROS2: Num2,Num3?
Для разделения, объединения и структурирования параметров вложенных макросов требуется еще один (непрямой) макрос второго уровня.
Для разделения, объединения и структурирования параметров вложенных макросов требуется еще один (непрямой) макрос второго уровня.Вы предлагаете для каждого случая создавать свою версию макроса перевода в строку. Но тогда решение не универсальное, т.к. зависит от вида макроса.
Получается, что нет общего механизма перевода макроса в строку.
Вы предлагаете создать отдельную версию макроса перевода строки для каждого случая. Но тогда решение не будет универсальным, потому что оно зависит от типа макроса.
Получается, что общего механизма перевода макроса в строку не существует.
Следите за вложенными вызовами макросов. Параметры макросов, которые сами являются макросами, расширяются на 2 этапа;
если arg - макрос, то он будет полностью расширен (т. е. оценен, или произойдет текстовая замена) во время компилятора/парсера.
Если arg - макрос (т. е. вложенные вызовы макросов), то при первом проходе он не будет расширен (не произойдет текстовой замены внутри тела макроса).
Также при первом проходе оператор # stringify и оператор ## concat становятся ON HOLD. Таким образом, вам нужен макрос второго уровня перенаправления.
При втором проходе тело макроса снова оценивается для дальнейших расширений (текстовая замена, stringify и concat).
Это ограничение макросов, поскольку они оцениваются компилятором во время выполнения как текст (а не как исполняемый код).
Это ограничение макросов, поскольку они оцениваются компилятором во время выполнения как текст (а не как исполняемый код).
Решение.
Если речь зашла о параметрических макросах, вот интересный вопрос: как развернуть в макросе комментарий. В таком макросе
комментарий нужен, чтобы заменить текст в input в терминале. Однако макрос не разворачивает комментарий, а опускает его.
как развернуть в макросе комментарий.
Никак.
Верю. Спасибо.
Solution.