однако хочется сделать красиво, а именно
— через #define определить названия функций, если они нужны
— определить эти же #define как пустую строку, если они не нужны.
Т.е. что-то вроде
#define INCLUDE_MY_CODE // удалить при необходимости
#ifdef INCLUDE_MY_CODE
#define MyTestFuncDef MyFunc
#else
#define MyTestFuncDef
#endif
вот только как сделать передачу списка параметров?
Re: Как сделать #define с переменным числом аргументов?
работает, но меня мучают сомнения как бы это потом не вылилось.
Ведь когда #define MyTestFuncDef
то в тексте от MyFunc (TEXT("TEXT1"), TEXT("TEXT2"), TEXT("TEXT3"));
останется (TEXT("TEXT1"), TEXT("TEXT2"), TEXT("TEXT3"));
компилятор проглатывает, но правильно ли это?
если в каачестве параметров будут исползоваться не const а функции — будут ли они отрабатывать?
Re: Как сделать #define с переменным числом аргументов?
Здравствуйте, Doc, Вы писали:
Doc>Есть несолько функций с пременным числом аргументов вида Doc>
void MyFunc (TCHAR *pszMsg, ...);
[...skipped...] Doc>однако хочется сделать красиво, а именно Doc>- через #define определить названия функций,
[...skipped...] Doc>вот только как сделать передачу списка параметров?
Для какого компилятора?
В gcc я например использую такую конструкцию для вывода отладочной информации:
Doc>однако хочется сделать красиво, а именно Doc>- через #define определить названия функций, если они нужны Doc>- определить эти же #define как пустую строку, если они не нужны. Doc>Т.е. что-то вроде
Doc>
#define INCLUDE_MY_CODE // удалить при необходимости
Doc>#ifdef INCLUDE_MY_CODE
Doc>#define MyTestFuncDef MyFunc
Doc>#else
Doc>#define MyTestFuncDef
Doc>#endif
Doc>вот только как сделать передачу списка параметров?
Есть еще один кривенький вариантик, потому что в одну строчку.
Doc>однако хочется сделать красиво, а именно Doc>- через #define определить названия функций, если они нужны Doc>- определить эти же #define как пустую строку, если они не нужны. Doc>Т.е. что-то вроде
Doc>
#define INCLUDE_MY_CODE // удалить при необходимости
Doc>#ifdef INCLUDE_MY_CODE
Doc>#define MyTestFuncDef MyFunc
Doc>#else
Doc>#define MyTestFuncDef
Doc>#endif
Doc>вот только как сделать передачу списка параметров?
Так делать плохо, так как аргументы всё равно будут вычисляться. А хотелось бы, насколько я понял, чтобы эти функции вели себя как стандартный assert -- компилировались в ничто.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: Как сделать #define с переменным числом аргументов?
А>>#ifndef _DEBUG А>>#define ASSERTVAR assertvar А>>#else А>>#define ASSERTVAR /##/ А>>#endif C>Невалидно. Ибо комменты рулят только до третьей фазы трансляции, а подстановка макросов выполняется в четвёртой. И C>
16.3.3/3: […] If the result [of concatenation] is not a valid preprocessing token, the behavior is undefined.
валидно, более того один из двух способов который не оставляет стринги аргументы в теле дебаг версии
вот случайно наткнулся в msdn на хороший способ:
__noop
Microsoft Specific
The __noop intrinsic specifies that a function should be ignored and the argument list unevaluated. It is intended for use in global debug functions that take a variable number of arguments.
The following code shows how you could use __noop:
// compiler_intrinsics__noop.cpp
// compile with or without /DDEBUG#include <stdio.h>
#if DEBUG
#define PRINT printf
#else
#define PRINT __noop
#endif
int main() {
PRINT("\nhello\n");
}