Re[2]: Вывести значение значение константы директивой препро
От: poilk  
Дата: 09.07.04 08:12
Оценка:
Здравствуйте, Dmi3evS, Вы писали:
DS>
#include <boost/preprocessor/slot/slot.hpp>
#include <boost/preprocessor/stringize.hpp>

DS>IMHO, очень жестокая техника. Но если очень надо...

Плохо, что компилятор понимает только С, так что этот вариант не особо подойдет.
А еще там Solaris и не-Intel процессор, и компилятор какой-то древний, так что приходится писать по-старинке.

Но это
Автор: _nn_
Дата: 08.07.04
и это
Автор: genre
Дата: 08.07.04
мне понравилось.
... << RSDN@Home 1.1.3 stable >>
Re[7]: Вывести значение значение константы директивой препро
От: elcste  
Дата: 09.07.04 08:45
Оценка:
Здравствуйте, Maslex, Вы писали:

RB>>>Проблема в том, чтобы получить сообщение на этапе препроцессинга.


E>>Да, в таком виде задача, конечно, нерешаема.


M>Почему не решаема.

M>А файлики .i разве кто-то отменял.

Вот-вот, давайте подробнее про файлики .i. Кто и где требует их существования?

Проблема в том, что в рамках стандартного переносимого C/C++ эту задачу нельзя даже сформулировать. Пропроцессинг — только одна из фаз трансляции. Никто не требует, чтобы реализация вообще имела отдельно стоящий препроцессор или могла сохранять результат препроцессирования. (Строго говоря, реализация и не имеет права на такой "наивный" подход: сначала препроцессинг, затем компиляция полученного после препроцессора файла. Просто потому что в этом случае некоторые программы будут работать неверно.)
Re[3]: Вывести значение значение константы директивой препро
От: Dmi3evS Россия http://dmi3s.blogspot.com/
Дата: 09.07.04 10:47
Оценка:
Здравствуйте, poilk, Вы писали:

P>
P>#include <boost/preprocessor/slot/slot.hpp>
P>#include <boost/preprocessor/stringize.hpp>
P>


P>Плохо, что компилятор понимает только С, так что этот вариант не особо подойдет.

P>А еще там Solaris и не-Intel процессор, и компилятор какой-то древний, так что приходится писать по-старинке.

boost/preprocessor — библиотека метапрограммирования на языке препроцессора. И, мне кажется, должна спокойно компилироваться и работать на старых C-шных компиляторах и не-Intel процессорах. Так что если будет желание, то вполне можно попробовать и на вашем страшном звере .
... << Rsdn@Home 1.1.4 beta 1 >>
Re: Вывести значение значение константы директивой препроцес
От: Дмитрий Бл-й Россия  
Дата: 09.07.04 11:50
Оценка: 12 (2)
Здравствуйте, poilk, Вы писали:

P>Есть код:

P>
P>#if (KEYCODE_LENGTH != 1000)
P>#error keycode length changed
P>#endif
P>

P>А есть способ узнать, какое значение в этот момент имеет KEYCODE_LENGTH? И вывести его на экран? Вычисляется это значение вложенными дефайнами из 5 различных файлов и в этом месте как раз 1000 и должно бы получиться. Код в тех файлах менять, к сожалению, нельзя.
P>Помогите, плиз...

outdigit.h:
/*outdigit.h*/
#if DIGIT==0
#pragma message("0")
#elif DIGIT==1
#pragma message("1")
#elif DIGIT==2
#pragma message("2")
#elif DIGIT==3
#pragma message("3")
#elif DIGIT==4
#pragma message("4")
#elif DIGIT==5
#pragma message("5")
#elif DIGIT==6
#pragma message("6")
#elif DIGIT==7
#pragma message("7")
#elif DIGIT==8
#pragma message("8")
#elif DIGIT==9
#pragma message("9")
#endif


outnumber.h:
/*outnumber.h*/
#ifdef DIGIT
#undef DIGIT
#endif

#define DIGIT ((COUNTER)%10)
#include "outdigit.h"
#undef DIGIT
#define DIGIT (((COUNTER)/10)%10)
#include "outdigit.h"
#undef DIGIT
#define DIGIT (((COUNTER)/100)%10)
#include "outdigit.h"
#undef DIGIT
#define DIGIT (((COUNTER)/1000)%10)
#include "outdigit.h"
#undef DIGIT
#define DIGIT (((COUNTER)/10000)%10)
#include "outdigit.h"
#undef DIGIT
#define DIGIT (((COUNTER)/100000)%10)
#include "outdigit.h"
/*...et c.*/


main.c:
#define COUNTER 11*15*37
#include "outnumber.h"


Рулит?
Re[2]: Вывести значение значение константы директивой препро
От: rus blood Россия  
Дата: 09.07.04 12:08
Оценка:
Здравствуйте, Дмитрий Бл-й, Вы писали:

ДБЙ>Рулит?


А вывод числа не задом наперед получиться?
А лишних нулей не будет перед числом?
Имею скафандр — готов путешествовать!
Re[8]: Вывести значение значение константы директивой препро
От: achp  
Дата: 09.07.04 12:12
Оценка:
Здравствуйте, elcste, Вы писали:

E>(Строго говоря, реализация и не имеет права на такой "наивный" подход: сначала препроцессинг, затем компиляция полученного после препроцессора файла. Просто потому что в этом случае некоторые программы будут работать неверно.)


Это что-то новое или?
Re[3]: Вывести значение значение константы директивой препро
От: Дмитрий Бл-й Россия  
Дата: 09.07.04 12:18
Оценка:
Здравствуйте, rus blood, Вы писали:

RB>Здравствуйте, Дмитрий Бл-й, Вы писали:


ДБЙ>>Рулит?


RB>А вывод числа не задом наперед получиться?

RB>А лишних нулей не будет перед числом?

Более того -- число выводится в столбик, цифра за цифрой
Но человеку-то это нужно для отлова ошибочного значения константы при компиляции, тут уж не до красот, можно и потерпеть.
Re[9]: Вывести значение значение константы директивой препро
От: elcste  
Дата: 09.07.04 12:36
Оценка:
Здравствуйте, achp, Вы писали:

E>>(Строго говоря, реализация и не имеет права на такой "наивный" подход: сначала препроцессинг, затем компиляция полученного после препроцессора файла. Просто потому что в этом случае некоторые программы будут работать неверно.)


A>Это что-то новое или?


#include <stdio.h>

#define PLUS +

int main()
{
    int i = 0;

    printf("%d\n", PLUS+i);
}

Каким должен быть результат препроцессинга?
Re[10]: Вывести значение значение константы директивой препр
От: Vamp Россия  
Дата: 09.07.04 12:43
Оценка:
E>Каким должен быть результат препроцессинга?
На первый взгляд

//То, что от стдио.х

int main()
{
    int i = 0;

    printf("%d\n", ++i);
}


А на самом деле?
Да здравствует мыло душистое и веревка пушистая.
Re[11]: Вывести значение значение константы директивой препр
От: elcste  
Дата: 09.07.04 13:02
Оценка:
Здравствуйте, Vamp, Вы писали:

E>>Каким должен быть результат препроцессинга?

V>На первый взгляд

V>//То, что от стдио.х

V>int main()
V>{
V>    int i = 0;

V>    printf("%d\n", ++i);
V>}

V>А на самом деле?

Ну, каким он должен быть, я не знаю. Это никто не специфицирует. Вот только код этот должен выводить 0, а Ваш выведет 1.
Re[12]: Вывести значение значение константы директивой препр
От: Vamp Россия  
Дата: 09.07.04 13:05
Оценка:
E>Вот только код этот должен выводить 0, а Ваш выведет 1.
Почему должен выводить 0?
Да здравствует мыло душистое и веревка пушистая.
Re[13]: Вывести значение значение константы директивой препр
От: elcste  
Дата: 09.07.04 13:30
Оценка:
Здравствуйте, Vamp, Вы писали:

E>>Вот только код этот должен выводить 0, а Ваш выведет 1.

V>Почему должен выводить 0?

Потому что здесь две лексемы '+' и '+', а не одна '++'.
Re[14]: Вывести значение значение константы директивой препр
От: Vamp Россия  
Дата: 09.07.04 13:40
Оценка:
E>Потому что здесь две лексемы '+' и '+', а не одна '++'.
В самом деле. Но и препроцессинг оказывается на высоте — в результате препроцессинга получается
+ +i
Да здравствует мыло душистое и веревка пушистая.
Re[2]: Вывести значение значение константы директивой препро
От: poilk  
Дата: 09.07.04 14:01
Оценка:
Здравствуйте, Дмитрий Бл-й, Вы писали:

ДБЙ>Рулит?


На борланде проверил — рулит , надо будет запомнить.
Беда в том, что мой компилятор не понимает #pragma message — пришлось через #error восстанавливать число по одной цифре. Теперь все работает, спасибо!
... << RSDN@Home 1.1.3 stable >>
Re[15]: Вывести значение значение константы директивой препр
От: elcste  
Дата: 09.07.04 14:06
Оценка:
Здравствуйте, Vamp, Вы писали:

E>>Потому что здесь две лексемы '+' и '+', а не одна '++'.

V>В самом деле. Но и препроцессинг оказывается на высоте — в результате препроцессинга получается
V>+ +i

А какой у Вас компилятор?
Re: Константу препроцессора можно показать так:
От: Demay  
Дата: 13.07.04 08:55
Оценка:
Здравствуйте, poilk, Вы писали:

P>Есть код:

P>
P>#if (KEYCODE_LENGTH != 1000)
P>#error keycode length changed
P>#endif
P>

P>А есть способ узнать, какое значение в этот момент имеет KEYCODE_LENGTH? И вывести его на экран? Вычисляется это значение вложенными дефайнами из 5 различных файлов и в этом месте как раз 1000 и должно бы получиться. Код в тех файлах менять, к сожалению, нельзя.
P>Помогите, плиз...

Вот так:
#define KEYCODE_LENGTH 100;
#define STR2(x)   #x
#define STR(x)    STR2(x)
#pragma message("KEYCODE_LENGTH = " STR(KEYCODE_LENGTH) )


Но Вам нужно чтобы из IDE на строчку можно было попасть ? Тогда так:
#pragma message(__FILE__ "(" STR(__LINE__) "): KEYCODE_LENGTH = " STR(KEYCODE_LENGTH))


Вывод компилятора:
х:\usr\home\src\atm_mon\atm_app.cpp(484): KEYCODE_LENGTH = 100


Это на VC-7.1, на других компиляторах не проверял...
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.