On Mon, Mar 22, 2004 at 05:53:12AM +0200, Alexander Bokovoy wrote: > > Нижеследующий кусок (одного патча) меня озадачил. Существует ли > > надежный способ определить: была ли переменная объявлена как имя > > массива, или как указатель? > В каком языке? В C? Да. Вот смотри: On Sun, Mar 21, 2004 at 10:39:23PM +0300, Alexey Tourbin wrote: > --- src/lvm.c.orig 2004-01-13 11:37:53.000000000 -0200 > +++ src/lvm.c 2004-01-13 11:33:34.000000000 -0200 > @@ -32,7 +32,7 @@ > > /* function to convert a lua_Number to a string */ > #ifndef lua_number2str > -#define lua_number2str(s,n) sprintf((s), LUA_NUMBER_FMT, (n)) > +#define lua_number2str(s,n) snprintf((s), sizeof((s)), LUA_NUMBER_FMT, (n)) > #endif > Т.е. есть кусок некоторого API, которое broken by design, но его кому-то хочется зафиксить. Но в данном случае использование sizeof в макросе некорректно, т.к. переменная s может быть указателем, а не именем массива, а размер любого указателя всегда равен sizeof(long). Пока приходит в голову только следующее: #define lua_number2str(s,n) (sizeof(s) > sizeof(char*)) ? \ snprintf((s), sizeof((s)), LUA_NUMBER_FMT, (n)) : \ sprintf((s), LUA_NUMBER_FMT, (n))