Получить текущее имя модуля компиляции в #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__)

Live Demo

Редактировать:

Поскольку вы хотите сообщить о файле.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
Другие вопросы по тегам