Preprocessor
От: shura_mam  
Дата: 03.11.03 20:20
Оценка:
Всем привет!

Есть в h файле
#define PROG_VER_MAJOR 1
#define PROG_VER_MINOR 0

хочется получить в C/CPP файле строку вида

static const char* s_szProgVer = "Program version 1.0";

но так, чтобы препроцессор сам формировал строку "1.0" исходя из PROG_VER_MAJOR и PROG_VER_MINOR.
Re: Preprocessor
От: Павел Кузнецов  
Дата: 03.11.03 20:47
Оценка: 3 (1)
Здравствуйте, shura_mam, Вы писали:

_>static const char* s_szProgVer = "Program version 1.0";

_>но так, чтобы препроцессор сам формировал строку "1.0" исходя из PROG_VER_MAJOR и PROG_VER_MINOR.

#include <stdio.h>

#define PROG_VER_MAJOR 1
#define PROG_VER_MINOR 0

#define VERSION2(prefix,major,minor) prefix###major"."###minor
#define VERSION1(prefix,major,minor) VERSION2(prefix,major,minor)
#define VERSION(prefix) VERSION1(prefix, PROG_VER_MAJOR, PROG_VER_MINOR)

int main()
{
  printf(VERSION("Program version "));
  return 0;
}
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[2]: Preprocessor
От: shura_mam  
Дата: 03.11.03 21:03
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Здравствуйте, shura_mam, Вы писали:


_>>static const char* s_szProgVer = "Program version 1.0";

_>>но так, чтобы препроцессор сам формировал строку "1.0" исходя из PROG_VER_MAJOR и PROG_VER_MINOR.

ПК>
ПК>#include <stdio.h>

ПК>#define PROG_VER_MAJOR 1
ПК>#define PROG_VER_MINOR 0

ПК>#define VERSION2(prefix,major,minor) prefix###major"."###minor
ПК>#define VERSION1(prefix,major,minor) VERSION2(prefix,major,minor)
ПК>#define VERSION(prefix) VERSION1(prefix, PROG_VER_MAJOR, PROG_VER_MINOR)

ПК>int main()
ПК>{
ПК>  printf(VERSION("Program version "));
ПК>  return 0;
ПК>}
ПК>


Спасибо...
Я делал примерно так же, но только вместо ### использовал ## и получал немного не то...

Кстати а сколько раз прогоняется препроцессор?
До тех пор пока есть символы #?
Re[2]: Preprocessor
От: Аноним  
Дата: 03.11.03 21:18
Оценка: +1
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Здравствуйте, shura_mam, Вы писали:


_>>static const char* s_szProgVer = "Program version 1.0";

_>>но так, чтобы препроцессор сам формировал строку "1.0" исходя из PROG_VER_MAJOR и PROG_VER_MINOR.

ПК>
ПК>#include <stdio.h>

ПК>#define PROG_VER_MAJOR 1
ПК>#define PROG_VER_MINOR 0

ПК>#define VERSION2(prefix,major,minor) prefix###major"."###minor
ПК>#define VERSION1(prefix,major,minor) VERSION2(prefix,major,minor)
ПК>#define VERSION(prefix) VERSION1(prefix, PROG_VER_MAJOR, PROG_VER_MINOR)

ПК>int main()
ПК>{
ПК>  printf(VERSION("Program version "));
ПК>  return 0;
ПК>}
ПК>


В принципе ### не обязательно юзать, — можно просто # обойтись:


#define PROG_VER_MAJOR 1
#define PROG_VER_MINOR 0

#define VERSION2(prefix,major,minor) prefix #major"." #minor
#define VERSION1(prefix,major,minor) VERSION2(prefix,major,minor)
#define VERSION(prefix) VERSION1(prefix, PROG_VER_MAJOR, PROG_VER_MINOR)
Re[2]: Preprocessor
От: shura_mam  
Дата: 03.11.03 21:18
Оценка:
Еще раз спасибо за помощь с препроцессором.
Но у меня возник еще один вопрос:
Моя программа пишет в лог дату компиляции файла:

printf( "This programm was compiled on "__DATE__"\n" );

Однако как заставить препроцессор сгенерить UNICODE строку?

wprintf( L"This programm was compiled on "__DATE__"\n" );
error C2308: concatenating mismatched wide strings


Такой же вопрос по поводу макроса __FILE__.
Существет ли его UNICODE вариант?
Re: Preprocessor
От: GarryIV  
Дата: 03.11.03 21:46
Оценка:
Здравствуйте, shura_mam, Вы писали:

_>Всем привет!


_>Есть в h файле

_>#define PROG_VER_MAJOR 1
_>#define PROG_VER_MINOR 0
_>хочется получить в C/CPP файле строку вида
_>static const char* s_szProgVer = "Program version 1.0";
_>но так, чтобы препроцессор сам формировал строку "1.0" исходя из PROG_VER_MAJOR и PROG_VER_MINOR.


#define PROG_VER_MAJOR 1
#define PROG_VER_MINOR 0
#define _version(x,y)    "Program version "#x"."#y
#define version(x,y) _version(x,y)

static const char* s = version(PROG_VER_MAJOR,PROG_VER_MINOR);
WBR, Igor Evgrafov
Re[3]: Preprocessor
От: GarryIV  
Дата: 03.11.03 22:16
Оценка:
Здравствуйте, shura_mam, Вы писали:


_>Еще раз спасибо за помощь с препроцессором.

_>Но у меня возник еще один вопрос:
_>Моя программа пишет в лог дату компиляции файла:

_>printf( "This programm was compiled on "__DATE__"\n" );


_>Однако как заставить препроцессор сгенерить UNICODE строку?


_>wprintf( L"This programm was compiled on "__DATE__"\n" );

_>error C2308: concatenating mismatched wide strings


_>Такой же вопрос по поводу макроса __FILE__.

_>Существет ли его UNICODE вариант?

Из MSDN


//You can create your own wide string version of __FILE__ as follows:

#include <stdio.h>
#define WIDEN2(x) L ## x
#define WIDEN(x) WIDEN2(x)
#define __WFILE__ WIDEN(__FILE__)
wchar_t *pwsz = __WFILE__;
WBR, Igor Evgrafov
Re[4]: Preprocessor
От: shura_mam  
Дата: 03.11.03 22:56
Оценка:
Здравствуйте, GarryIV, Вы писали:

GIV>Здравствуйте, shura_mam, Вы писали:



_>>Еще раз спасибо за помощь с препроцессором.

_>>Но у меня возник еще один вопрос:
_>>Моя программа пишет в лог дату компиляции файла:

_>>printf( "This programm was compiled on "__DATE__"\n" );


_>>Однако как заставить препроцессор сгенерить UNICODE строку?


_>>wprintf( L"This programm was compiled on "__DATE__"\n" );

_>>error C2308: concatenating mismatched wide strings


_>>Такой же вопрос по поводу макроса __FILE__.

_>>Существет ли его UNICODE вариант?

GIV>Из MSDN



GIV>
GIV>//You can create your own wide string version of __FILE__ as follows:

GIV>#include <stdio.h>
GIV>#define WIDEN2(x) L ## x
GIV>#define WIDEN(x) WIDEN2(x)
GIV>#define __WFILE__ WIDEN(__FILE__)
GIV>wchar_t *pwsz = __WFILE__;
GIV>


Спасибо.
Пожалуй мне пора поменять мой MSDN:
— на моем локальном MSDN такого нет.
— В MSDN у MS
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_predir_predefined_macros.asp
есть...
Re: Preprocessor
От: Vamp Россия  
Дата: 04.11.03 08:03
Оценка:
А не лучше ли отказаться от unholy макросов и сделать так:

const std::string majorvesrion="1";
const std::string minorvesrion="1";


Какая есть особая необходимость именно в макроопределениях?
Да здравствует мыло душистое и веревка пушистая.
Re[2]: Preprocessor
От: Павел Кузнецов  
Дата: 04.11.03 08:23
Оценка:
Здравствуйте, Vamp, Вы писали:

V> А не лучше ли отказаться от unholy макросов и сделать так:


V>
 V> const std::string majorvesrion="1";
 V> const std::string minorvesrion="1";
 V>


V> Какая есть особая необходимость именно в макроопределениях?


Вероятно, unholy условная компиляция...
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[2]: Preprocessor
От: Кодт Россия  
Дата: 04.11.03 09:05
Оценка: +1
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>
ПК>#include <stdio.h>

ПК>#define PROG_VER_MAJOR 1
ПК>#define PROG_VER_MINOR 0

ПК>#define VERSION2(prefix,major,minor) prefix###major"."###minor
ПК>#define VERSION1(prefix,major,minor) VERSION2(prefix,major,minor)
ПК>#define VERSION(prefix) VERSION1(prefix, PROG_VER_MAJOR, PROG_VER_MINOR)

ПК>int main()
ПК>{
ПК>  printf(VERSION("Program version "));
ПК>  return 0;
ПК>}
ПК>


А можно без ###. Достаточно просто # (приведение к строке). Ведь между кусками строкового литерала ("версия" "1" "." "0") можно вставлять сколько угодно пробелов, поэтому дополнительная склейка (##) не нужна.
Перекуём баги на фичи!
Re[2]: Preprocessor
От: shura_mam  
Дата: 04.11.03 09:42
Оценка:
Здравствуйте, Vamp, Вы писали:

V>А не лучше ли отказаться от unholy макросов и сделать так:


V>
V>const std::string majorvesrion="1";
V>const std::string minorvesrion="1";
V>


V>Какая есть особая необходимость именно в макроопределениях?


Просто это нужно для библиотеки, одна из функций которой возвращает свою версию в виде DWORD.
Строку версии библиотека пишет в свой лог. Зачем делать лишние преобразования в runtime, если эта строка уже известна на стадии компиляции?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.