Gcc определяет что-нибудь, когда указан -g? - PullRequest
44 голосов
/ 03 ноября 2011

Короче, я хочу знать, определяет ли 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 также удаляет мое определение. Мне по-прежнему требуется, чтобы я сказал им определить его, если они не хотят переводить заголовки в режим отладки.

Ответы [ 3 ]

35 голосов
/ 03 ноября 2011

Вы можете увидеть список всех макросов, которые gcc / g ++ определяет для любой комбинации таких флагов:

$ g++ -E -dD -xc++ /dev/null

Например:

[max@truth ~]$ g++ -E -dD -xc++ /dev/null > a
[max@truth ~]$ g++ -E -dD -xc++ -g -O3 /dev/null > b
[max@truth ~]$ diff a b
1a2
> # 1 "/home/max//"
173c174
< #define __NO_INLINE__ 1
---
> #define __OPTIMIZE__ 1

Давайте посмотрим, будет ли -gопределяет что-либо:

[max@truth ~]$ g++ -E -dD -xc++ -g /dev/null > c
[max@truth ~]$ diff a c
1a2
> # 1 "/home/max//"

Дополнительная директива препроцессора, но без дополнительных определений для флага -g.

17 голосов
/ 24 июля 2016

Как уже говорили другие, и как видно из руководства , GCC не предоставляет встроенных макросов, которые указывают, будет ли генерироваться отладочная информация (режим -g).Я хочу добавить, что это специально.

Давным-давно авторы GCC (RMS, Kenner, возможно, пара других) решили, что включение информации отладки не должно вызывать любые изменения в реальном коде, чтобы уменьшить риск ошибки , загадочно исчезающей при попытке отладки .Это базовый принцип проектирования в GCC, и даже сегодня разработчики изо всех сил стараются его поддерживать.

Определение макроса нарушит этот принцип проектирования, поскольку он позволит исходному коду изменить себя в ответдо -g.

11 голосов
/ 03 ноября 2011

Бег
g++ -E -dD -xc++ /dev/null
против
g++ -E -dD -g -xc++ /dev/null
не показывает мне никаких дополнительных символов.

Этого, в сочетании с отсутствием какой-либо документации о том, что символы определены, должно быть достаточно, чтобы с уверенностью сказать, что ничего не определено.

...