ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
18 июля
614167
Ксения (15.08.2015 22:21 - 22:30, просмотров: 1716)
Как узнать, что скрывается под выражением, порождаемом конструкцией #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* ? :)