![]() |
Помогите с препроцессором в C\c++
Захотелось мне слепить новый макрос-строку из нескольких макросов, но ни как не получается, может посоверуйте как сделать.
Например: Есть #define A1 Bla-h bla-h % #define A2 30 #define A3 d Хочу получить с помощью макроподстановки : "Bla-h bla-h %30d" Вот как это следать? Во-первых как включить символ " в макрос? Пробовал. #define " #define \" #define "" Ни один вроде не подходит. Во-вторых, как объединить два макроса, чтобы между ними не возникали лишние символы и происходила макроподстановка (##- объединяет, но макроподстановка, вроде не происходит). Кстати. Может кто знает, где можно найти исчерпывающуу документацию по препроцессору. |
макросы - это зло. отлаживать потом труднее. лучше const char* делать.
по препроцессору начать с - man cpp. :) |
Цитата:
Цитата:
1) Объявить const char*, но это не гибко, т.к. при замене значений полей нужно менять цифры покрайней мере в друх местах (с строке и для констант или вообще повсюду в программе) 2) С помощью sprintf ренерировать строку в начале программы, но это не эффективно. 3) Переписать/подправить стандартную функцию scanf. Но это долго/и, кажется, не оправдано сложно 4) Написать свой препроцессор и перед компиляцией пропускать исходники через него. Не гибко, будет сложно для понимания исходников другими людьми. Как понимаю найлучшее решение пока 2) или вообще отказ от гибкости. Но думаю, что должно существовать решение при помощи препроцессора и оно, понятно, будет самым элегантным и эффективным. |
Crazy_kettle
то что ты хочешь, можно сделать так: Код:
#include "stdio.h" |
to programmer
Вы меня не поняли. Как реализовать варианты 1)-4) я знаю, но они меня не устраивают и там сказано почему. Например, вариант со sprintf (и я его явно не реализовывал бы с помощью макроса), мне не нравиться, т.к. строка известно на этапе компиляции, а с использованием sprintf она будет создаваться на этапе выполнения проги. Что я хочу, это автоматизировать процес создания строки, чтобы достаточно было изменить значение одной константы и перекомпилировать программу, для изменения ширины полей таблицы и ширины, занимаемой целым. Думаю, что это можно слелать с помощью макросов. Если бы я знал, как включить символ " в макрос и как объединить два макроса, чтобы между ними не возникали лишние символы и происходила макроподстановка, реализация не составила бы труда: Объявляем BEGSTRING как "Blah-blah % #define INTSIZE 30 Объявляем ENDSTRING как d" А дальше объединяем BEGSTRING,INTSIZE и ENDSTRING. Надеюсь понятно изложил то, что хочу получить и сейчас жду советов. Кстати, может кто знает ответ на ранее поставленный вопрос: Может кто знает, где найти исчерпывающую документацию по препроцессору или хотябы где её можно поискать Был совет почитать man cpp. Ну что ж пойду к другу, почитаю. Хотя я не уверен, что там найду то, что мне нужно. (Я смотрел книги Керниган и Ричи, и Страуструпа, но там только базовая информация и ничего не помогло мне решить мою проблему). |
Crazy_kettle
Мне кажется, что сделать точно так как ты хочешь - нельзя. Хотя попробуй поищи инфу здесь |
to Programmer
Большое спасибо. Не думал в MSDN глянуть, а зря ... (как выяснилось) После беглого обзора написанной информации, я было уже обрадовался. Но, оказалось, что не всё так просто. Думал, есть даже два варианта, но прогадал. (Может, кому-нибудь будет интересно. Поэтому я приведу их) Цитата:
или Цитата:
Второй дан, чисто из-за любознательности, т.к. вместо числа 10, можно подставить лишь число и никак не макрос-константу, и тем более не переменную и понятно по каким причинам. Вот и сталкнулся я с несовместимостью строковой константы и числовой константы, хотя поидее для препроцессора (не для компилятора) они отличаются лишь ковычками """, ведь после препроцессора, за обработку вступает компилятор, а значит, все числовые константы всё равно должны быть оставлены в символьном виде (т.е. препроцессор либо копирует строки, либо переводит символьные константы в строки). Странно, что нет возможности (хотя может, это я просто не нашёл) перевести числовые константы в строковые константы и наоборот. Так что возникает вопрос "Или это по большому счёту никому не нужно, или что-то я не так понимаю?". Почитал я man cpp. Но там вообще нет никакой документации о синтаксисе, правилах использования, "фишках", только мануал но исплользованию программы cpp |
Цитата:
#define '"' |
to alexey_ma
Цитата:
|
| Часовой пояс GMT +4, время: 20:24. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.