STATIC_ASSERT при вызове функции
От: Vain Россия google.ru
Дата: 11.09.06 21:19
Оценка:
Перевожу исходники с WIN32 на WINCE. Есть некоторые проблемы, к примеру, в WINCE часто нету функций принимающих multibyte значения, а есть токо для char* и для wchar_t* типов. Или просто нету функции, которая есть в WIN32. Решил написать обёртку такого рода:
(к примеру для функции GetCurrentProcess)
//GetCurrentProcess.h
#pragma once

#if defined(WIN32)
#include <Winbase.h>

#pragma comment(lib,"Kernel32.lib")
#pragma message("Linker: Automatically linking with Kernel32.lib")

#elif defined(WINCE)
#include <Kfuncs.h>

#pragma comment(lib,"Coredll.lib")
#pragma message("Linker: Automatically linking with Coredll.lib")

#endif


Но иногда в WINCE функций нет, а в WIN32 есть:

(для функции _mbscmp)
//_mbscmp.h
#pragma once

#if defined(WIN32)
#include <mbstring.h>

#elif defined(WINCE)

#pragma message("Warning: _mbscmp function doesn't exist in WinCE platform")

#endif


Далее просто включается в код, где используется функция вместо оригинальных заголовков, "обёрточные" заголовки.
Но мне не нравиться #pragma message, будет куча таких ненужных вообщемто сообщений.
Если заменить #pragma message на объявление _mbscmp — будет компилироваться, но не будет линковаться.

Думаю заменить на определение функции, чтобы при её вызове под WINCE компилятор начал ругаться в место определения, но незнаю что написать во внутрь.

//_mbscmp.h
#pragma once

#if defined(WIN32)
#include <mbstring.h>

#elif defined(WINCE)

int _mbscmp(const unsigned char *string1,const unsigned char *string2) {
  //что сюда написать?
}

#endif


Но ругаться он должен только при использовании функции.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re: STATIC_ASSERT при вызове функции
От: Ulfur Россия  
Дата: 13.09.06 06:28
Оценка:
Здравствуйте, Vain, Вы писали:

V>Перевожу исходники с WIN32 на WINCE. Есть некоторые проблемы, к примеру, в WINCE часто нету функций принимающих multibyte значения, а есть токо для char* и для wchar_t* типов. Или просто нету функции, которая есть в WIN32. Решил написать обёртку такого рода:

V>(к примеру для функции GetCurrentProcess)
V>
V>//GetCurrentProcess.h
V>#pragma once

V>#if defined(WIN32)
V>#include <Winbase.h>

V>#pragma comment(lib,"Kernel32.lib")
V>#pragma message("Linker: Automatically linking with Kernel32.lib")

V>#elif defined(WINCE)
V>#include <Kfuncs.h>

V>#pragma comment(lib,"Coredll.lib")
V>#pragma message("Linker: Automatically linking with Coredll.lib")

V>#endif
V>


V>Но иногда в WINCE функций нет, а в WIN32 есть:


V>(для функции _mbscmp)

V>
V>//_mbscmp.h
V>#pragma once

V>#if defined(WIN32)
V>#include <mbstring.h>

V>#elif defined(WINCE)

V>#pragma message("Warning: _mbscmp function doesn't exist in WinCE platform")

V>#endif
V>


V>Далее просто включается в код, где используется функция вместо оригинальных заголовков, "обёрточные" заголовки.

V>Но мне не нравиться #pragma message, будет куча таких ненужных вообщемто сообщений.
V>Если заменить #pragma message на объявление _mbscmp — будет компилироваться, но не будет линковаться.

V>Думаю заменить на определение функции, чтобы при её вызове под WINCE компилятор начал ругаться в место определения, но незнаю что написать во внутрь.


V>
V>//_mbscmp.h
V>#pragma once

V>#if defined(WIN32)
V>#include <mbstring.h>

V>#elif defined(WINCE)

V>int _mbscmp(const unsigned char *string1,const unsigned char *string2) {
V>  //что сюда написать?
V>}

V>#endif
V>


V>Но ругаться он должен только при использовании функции.


1) проще всего
чуть ниже пиши #pragma deprecated(_mbscmp) и не дизабли 4995 варнинг

2) если для С++, то пиши шаблонную функцию, внутри которой boostовкий или lokiевский STATIC ASSERT.
Re[2]: STATIC_ASSERT при вызове функции
От: Vain Россия google.ru
Дата: 13.09.06 11:17
Оценка:
Здравствуйте, Ulfur, Вы писали:

V>>Но ругаться он должен только при использовании функции.

U>1) проще всего
U>чуть ниже пиши #pragma deprecated(_mbscmp) и не дизабли 4995 варнинг
Это идея у меня была, тогда токо варнинг будет генерится
U>2) если для С++, то пиши шаблонную функцию, внутри которой boostовкий или lokiевский STATIC ASSERT.
А что в качестве условия писать? false? Тогда и без вызова будет ругаться

Я придумал уже:
namespace { static int _mbscmp(const unsigned char *string1,const unsigned char *string2); }


при вызове приведёт тут же к ошибке, т.к. функция не реализована, а если реализация будет выше по коду, то приведёт к амбигуис калу Но токо при вызове.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[3]: STATIC_ASSERT при вызове функции
От: Ulfur Россия  
Дата: 14.09.06 06:35
Оценка:
Здравствуйте, Vain, Вы писали:

V>А что в качестве условия писать? false? Тогда и без вызова будет ругаться


не, не будет... Будет ругаться только при попытке инстанцирования. Но ведь тебе как раз не надо инстанцировать, так?
Re[4]: STATIC_ASSERT при вызове функции
От: Vain Россия google.ru
Дата: 14.09.06 14:17
Оценка:
Здравствуйте, Ulfur, Вы писали:

U>не, не будет... Будет ругаться только при попытке инстанцирования. Но ведь тебе как раз не надо инстанцировать, так?

ну если функция шаблонная, то да, но у меня же она не шаблонная.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.