Получить текущее имя модуля компиляции в #include
Моя текущая цель - создать одну (или как можно меньше) строку кода, которая переключит оставшуюся часть активного модуля компиляции в неоптимизированную отладочную конфигурацию. Мои первые инстинкты были либо:
FORCE_DEBUG;
// code below here will be forced to be unoptimized and in a debug environment
или же
#include "ForceDebug.h"
// code below here will be forced to be unoptimized and in a debug environment
было бы идеально. В моем рабочем пространстве для преобразования в неоптимизированную конфигурацию отладки требуется изменить уровень оптимизации прагмы, а также #undef для некоторых макросов и #define для других макросов.
Макрос FORCE_DEBUG не работает, потому что он должен выполнять директивы препроцессора #undef и #define, которые, как я понимаю, не могут быть оценены внутри макроса.
Вместо этого у меня есть рабочая версия #include "ForceDebug.h". Но я хочу сообщить разработчику, что они отключили оптимизацию на данном модуле компиляции (чтобы они не регистрировали его, или если они проверяют, чтобы он мог быть пойман и исправлен). В идеале это сообщение включает имя файла любого файла #include "ForceDebug.h" или текущий модуль компиляции.
Вот примерный ForceDebug.h
#pragma once
#pragma message("DISABLING OPTIMIZATION IN" COMPILATION_UNIT_FILE)
#undef _RELEASE
#define _DEBUG
#ifdef _MSC_VER
# pragma optimize("", off)
#else
# pragma GCC optimize("O0")
#endif
Таким образом, сайт вызова будет выглядеть примерно так: Foo.cpp:
// this messages "ForceDebug.h", I want to message "Foo.cpp"
//#define COMPILATION_UNIT_FILE __FILE__
// double macro also messages "ForceDebug.h"
//#define COMPILATION_UNIT_FILE COMPILATION_UNIT_FILE2(__FILE__)
//#define COMPILATION_UNIT_FILE2(x) x
// this works but requires doing it manually, which I'm trying to avoid
#define COMPILATION_UNIT_FILE "Foo.cpp"
#include "ForceDebug.h"
// code below here will be forced to be unoptimized, debug environment
Я не могу использовать __FILE__
потому что сообщения о ForceDebug.h, когда я хочу, чтобы он сообщал о Foo.cpp.
Если бы я мог оценить __FILE__
внутри Foo.cpp и передайте оцененную версию в ForceDebug.h, что было бы приемлемо, но я пробовал рекурсивные вызовы макросов, и он по-прежнему сообщал ForceDebug.h
Есть ли способ заставить его передать "Foo.cpp" во включаемый файл или получить это значение другими способами для clang или Visual Studio?
2 ответа
Мне не удалось найти способ выбросить текущее имя модуля компиляции из включенного файла.
Однако предложенный вами синтаксис требует от пользователя "ForceDebug.h"
добавить другую директиву, чтобы выставить имя модуля компиляции в заголовочный файл. Вместо этого вы можете перевернуть его и разрешить простое включение, которое определяет макрос, который позволяет отправлять сообщение.
Хотя, вообще говоря, макросы нельзя использовать для генерации директив препроцессора, для показанных вами компиляторов существует синтаксис прагм. У каждого MSVC и GCC свой синтаксис, но условная компиляция может сделать синтаксис единообразным.
В вашем исходном файле:
#include "ForceDebug.h"
FORCE_DEBUG;
//... rest of source
В "ForceDebug.h"
:
#pragma once
#ifdef _MSC_VER
#define DO_PRAGMA(X) __pragma(X)
#define NO_OPT optimize("", off)
#else
#define DO_PRAGMA2(X) _Pragma(#X)
#define DO_PRAGMA(X) DO_PRAGMA2(X)
#define NO_OPT GCC optimize("O0")
#endif
#define FORCE_DEBUG \
DO_PRAGMA(message("DISABLING OPTIMIZATION IN " __FILE__)) \
DO_PRAGMA(NO_OPT) \
struct __force_debug
#undef _RELEASE
#define _DEBUG
Вы могли бы использовать __FILE__
предопределенный макрос, как показано ниже:
#pragma message("DISABLING OPTIMIZATION IN " __FILE__)
Редактировать:
Поскольку вы хотите сообщить о файле.cpp, я бы пошел другим путем. То есть я бы изменил ForceDebug.h на:
#pragma once
#undef _RELEASE
#define _DEBUG
#define OPT_OFF
^^^^^^^^^^^^^^^
#ifdef _MSC_VER
# pragma optimize("", off)
#else
# pragma GCC optimize("O0")
#endif
И тогда я бы поместил сообщение о потенции в мой файл.cpp:
#include "foo.h"
...
#ifdef OPT_OFF
#pragma message("DISABLING OPTIMIZATION IN " __FILE__)
#endif