Néhány esetben nem tudtam használni a gcc-ben bevált dolgokat VS alatt. Ezek többségét kicsit másként lehet használni.
- Az első probléma a változó paraméterlistájú makrókkal volt. Írtam egy log-oló függvényt. Ennek az első két paramétere két wchar_t (első a függvény nevét tartalmazó string, a második a format string). Után jönnek a kiírandó argumentumok. Így hívom meg
log(__FUNCTIONW__, L"Start: value=%d", value);
vagy
log(__FUNCTIONW__, L"Source file: %s, Dest file: %s", source, dest);
A log-on belül vswprintf-et használok. Érdekes, hogy a "%s" használható a wchar_t argumentumok kiírására. Hmmm...#include <stdarg.h>
void log( const wchar_t *funcname, const wchar_t *fmt, ... )
{
wchar_t str[2048];
va_list p;
va_start(p, fmt);
vswprintf(str, fmt, p);
va_end(p);
wstring tmp(funcname);
tmp += L"() - ";
tmp += str;
cout << tmp;
}
(Na jó, az a wstring-es ügy randa, de így sikerült...) Na szóval a __FUNCTIONW__ beírását egy makróval szerettem volna megspórolni. Ezt így szokás:#define LOG(fmt, ...) log(__FUNCTIONW__, fmt, ## __VA_ARGS__)
Érdekes, hogy a VS-ben a ## nem működik. De nélküle szépen megy! - A másik a #warning utasítás volt, amit nem találtam. Szerettem volna forgatás közben üzeneteket kiírni, hogy később ne felejtsem el, hogy a félmegoldásokat bereszeljem. Végül egy kolléga kisegített! VS-ben a
#pragma message("akarmi")
működik. Egy ilyen példát találtam egy szebb formázásra:
#define __STR2__(x) #x
#define __STR1__(x) __STR2__(x)
#define WARN message(" WARNING: "__FILE__":"__STR1__(__LINE__)"("__FUNCTION__"): ")
Usage:
#pragma WARN("Need to do 3D collision testing")
Érdekes az __STR1__ és __STR2__ használata. Az első a __LINE__ macro-t kifejti, a második pedig szöveget csinál belőle.
Jó sok mindent tud a VS, de még utána kell néznem, hogyan lehet fordítást csinálni command line-ból!
Vadásszunk bitet minden nap!
+jegyzések