Короче, я хочу знать, определяет ли gcc (или g ++. Он мне нужен в C , но также интересует c ++) какие-либо специальные символы, если -g
включен. Является ли? Если да, то какие символы?
В процессе поиска я обнаружил, что:
_DEBUG
определяется вручную (вручную я имею в виду -D_DEBUG
) и является привычкой, взятой у программистов Visual C (поскольку VC определяет _DEBUG
при компиляции в режиме отладки)
NDEBUG
определяется, если НЕ в режиме отладки. Хотя я нашел несколько мест, где это сказано, я попытался использовать мои gcc и g ++ в файлах .c и .cpp, и ни в одном из них с -g
или без него такой символ не был определен!
Редактировать : Позвольте мне продемонстрировать, почему я не хочу использовать нестандартный символ:
Представьте себе модуль ядра, который что-то делает, а также предоставляет файлы заголовков для включения в другие модули ядра, чтобы они могли подключаться к этому.
Теперь как средство, в одном из заголовочных файлов у меня есть:
#ifdef DEBUG <-- This is what I need
#define LOG(x, ...) printk("Some extra info"x, ##__VA_ARGS__);
#else
#define LOG(x, ...) printk("Without extra info"x, ##__VA_ARGS__);
#endif
Обратите внимание, что имя на самом деле не LOG
, это пример.
Теперь я могу использовать любой символ для DEBUG
, но если кто-то включит мой заголовок, он не сможет определить этот символ. Конечно, я могу сказать им: «Кстати, перевести заголовки в режим отладки, определить этот другой символ», но мне это просто не подходит.
Я мог бы определить символ в заголовке и включить его во все файлы заголовков. Таким образом, если они включают один из моих заголовков, они также получают символ отладки. Теперь проблема в том, что, если они не не хотят компилировать в режиме отладки, мои заголовки все еще думают, что они находятся в режиме отладки.
Поэтому я подумал, что лучше всего было бы использовать символ, который определяется при использовании -g
, если таковые имеются!
Обновление
Пока я пришел к выводу, что я мог бы сделать что-то вроде этого:
how_to_build.h
#if !defined(NDEBUG)
#define MY_DEBUG
#endif
Использование:
#include "how_to_build.h"
#ifdef MY_DEBUG
// rest of the story
Таким образом, общая опция NDEBUG
также удаляет мое определение. Мне по-прежнему требуется, чтобы я сказал им определить его, если они не хотят переводить заголовки в режим отладки.