Ксения (15.08.2015 22:21 - 22:30, просмотров: 1838)
Как узнать, что скрывается под выражением, порождаемом конструкцией #define на языке С/C++? Сказу осажу, что идея посмотреть, как оно определяется в хидере, в данном случае не проходит, т.к. в этом определении активно используется условная компиляция, зависимая от множества других определений, столько мне неизвестных.
Короче говоря, распутать этот узел в уме никак не удается, тем не менее компилятор (препроцессор?) ничуть не затрудняется подстановкой этого выражения везде, где оно встречается. К сожалению промежуточный листинг (когда препроцессор уже совершил подстановки, но до компиляции очередь еще не дошла) выпросить нельзя, т.к. по нынешним временам препроцессор окончательно врос в компилятор. Пошаговый отладчик тоже в этом деле помочь не может. Ну, и распечатать это значение, как текст, тоже невозможно, т.к. для этого его пришлось бы заключить в кавычки, а содержимое кавычек подстановкам не подлежит.
Вот наглядный пример для иллюстрации:
#if defined(_WIN32) || defined(__WIN32__)
# define IMSL_DECL __cdecl
# ifdef __BORLANDC__
# ifdef _RTLDLL
# ifndef IMSL_EF
# ifdef _EXPFUNC
# define IMSL_EF _EXPFUNC
# else
# define IMSL_EF __import
# endif
# ifdef _EXPDATA
# define IMSL_ED _EXPDATA
# else
# define IMSL_ED __import
# endif
# endif
# else
# define IMSL_EF
# define IMSL_ED
# endif
# define IMSL_CI
# else
/* Visual C++ */
# if defined(_DLL) && !defined(IMSL_STATIC)
# ifndef IMSL_CI
# ifdef _CRTIMP
# define IMSL_CI _CRTIMP
# else
# define IMSL_CI __declspec(dllimport)
# endif
# endif
# else
# define IMSL_CI
# endif
# define IMSL_EF
# define IMSL_ED
# endif
#else
# define IMSL_DECL
# define IMSL_CI
# define IMSL_EF
# define IMSL_ED
#endif
#define IMSL_PROTO(P,Q) P Q
IMSL_CI char * IMSL_DECL IMSL_EF IMSL_PROTO(imsl_version, (int));
Так какой же тип у функции imsl_version(int) помимо char* ? :)