Функции с переменным числом аргументов и переопределение их
От: Niten  
Дата: 28.10.09 17:11
Оценка:
Делал функцию
bool _func(int a, char*b ,char* lpbuf);
#define func(__LINE__, __FILE__, buf ) _func( a, b , buf)

все нормально робит
потребовалась функция с переменным числом аргументов, пытаюсь ее переопределить
bool _func(int a, char*b ,char* lpFormat, ...);
#define func(__LINE__, __FILE__,format,...) _func( a, b , lpFormat, ....)

при компиляции выдает ошибки
Как это сделать?
Re: Функции с переменным числом аргументов и переопределение
От: MT-Wizard Украина  
Дата: 28.10.09 17:23
Оценка:
Здравствуйте, Niten, Вы писали:

N>Делал функцию

N>...
N>#define func(__LINE__, __FILE__,format,...) _func( a, b , lpFormat, ....)

N>при компиляции выдает ошибки

N>Как это сделать?

У вас в дефайне 3 точки, а в вызове — 4.
(шутка)

Если это не компилятор с полной поддержкой С99, то макросы с переменным числом агрументов не поддерживаются вовсе.
А ти, москалику, вже приїхав (с)
Re: Функции с переменным числом аргументов и переопределение
От: Niten  
Дата: 28.10.09 17:27
Оценка:
(исправленно)
Делал функцию
bool _func(int a, char*b ,char* lpbuf);
#define func( buf ) _func( __LINE__, __FILE__ , buf)

все нормально робит
потребовалась функция с переменным числом аргументов, пытаюсь ее переопределить
bool _func(int a, char*b ,char* lpFormat, ...);
#define func(format,...) _func( __LINE__, __FILE__ , lpFormat, ....)

при компиляции выдает ошибки
Как это сделать?
Re[2]: Функции с переменным числом аргументов и переопределе
От: Niten  
Дата: 28.10.09 17:29
Оценка:
Здравствуйте, MT-Wizard, Вы писали:

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


N>>Делал функцию

N>>...
N>>#define func(__LINE__, __FILE__,format,...) _func( a, b , lpFormat, ....)

N>>при компиляции выдает ошибки

N>>Как это сделать?

MW>У вас в дефайне 3 точки, а в вызове — 4.

MW>(шутка)

MW>Если это не компилятор с полной поддержкой С99, то макросы с переменным числом агрументов не поддерживаются вовсе.


Visual C++ 2008 ?
Re: Функции с переменным числом аргументов и переопределение
От: Programador  
Дата: 28.10.09 17:36
Оценка:
Здравствуйте, Niten, Вы писали:

N>при компиляции выдает ошибки

N>Как это сделать?

__LINE__, __FILE__ передать через глобальные
typedef bool TFun(char* lpFormat, ...);
TFun& protez(int,char*)
{... return myFun};
#define func protez(__LINE__, __FILE__)
Re: Функции с переменным числом аргументов и переопределение
От: Кодт Россия  
Дата: 28.10.09 17:36
Оценка: 1 (1) +1
Здравствуйте, Niten, Вы писали:

N>Делал функцию

N>bool _func(int a, char*b ,char* lpbuf);
N>#define func(__LINE__, __FILE__, buf ) _func( a, b , buf)

N>все нормально робит


Правда нормально? Даже с учётом того, что ты использовал стандартные макросы __FILE__ и __LINE__ как имена аргументов макроса?
Может, там было что-то
bool _func(int l, const char* f, const char* buf);

#define func(buf) _func(__LINE__,__FILE__,buf)


N>потребовалась функция с переменным числом аргументов, пытаюсь ее переопределить

N>bool _func(int a, char*b ,char* lpFormat, ...);
N>#define func(__LINE__, __FILE__,format,...) _func( a, b , lpFormat, ....)

Есть два пути:
Первый — использовать "эллиптические" параметры макроса __VA_ARGS__
bool _func(int l, const char* f, const char* buf, ...);

#define func(buf,...) _func(__LINE__,__FILE__,buf,__VA_ARGS__)

Второй — если компилятор ещё не поддерживает эллипсис в макросах — использовать карринг
struct func_invoker
{
    int l;
    const char* f;
    
    func_invoker(int l, const char* f) : l(l), f(f) {}
    
    bool invoke(const char* buf, ...) const; // делае то же самое, что _func(l,f,buf,...)
};

#define func /*(buf,...)*/  func_invoker(__FILE__,__LINE__).invoke /*(buf,__VA_ARGS__)*/
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re[2]: Функции с переменным числом аргументов и переопределе
От: Niten  
Дата: 28.10.09 17:44
Оценка:
Здравствуйте, Кодт, Вы писали:

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


N>>Делал функцию

N>>bool _func(int a, char*b ,char* lpbuf);
N>>#define func(__LINE__, __FILE__, buf ) _func( a, b , buf)

N>>все нормально робит


К>Правда нормально? Даже с учётом того, что ты использовал стандартные макросы __FILE__ и __LINE__ как имена аргументов макроса?

К>Может, там было что-то
К>
К>bool _func(int l, const char* f, const char* buf);

К>#define func(buf) _func(__LINE__,__FILE__,buf)
К>


N>>потребовалась функция с переменным числом аргументов, пытаюсь ее переопределить

N>>bool _func(int a, char*b ,char* lpFormat, ...);
N>>#define func(__LINE__, __FILE__,format,...) _func( a, b , lpFormat, ....)

К>Есть два пути:

К>Первый — использовать "эллиптические" параметры макроса __VA_ARGS__
К>
К>bool _func(int l, const char* f, const char* buf, ...);

К>#define func(buf,...) _func(__LINE__,__FILE__,buf,__VA_ARGS__)
К>

К>Второй — если компилятор ещё не поддерживает эллипсис в макросах — использовать карринг
К>
К>struct func_invoker
К>{
К>    int l;
К>    const char* f;
    
К>    func_invoker(int l, const char* f) : l(l), f(f) {}
    
К>    bool invoke(const char* buf, ...) const; // делае то же самое, что _func(l,f,buf,...)
К>};

К>#define func /*(buf,...)*/  func_invoker(__FILE__,__LINE__).invoke /*(buf,__VA_ARGS__)*/
К>


Спасибо помогло
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.