Есть ли способ автоматически воспроизводить #define в каждом исходном файле? - PullRequest
2 голосов
/ 25 августа 2009

Мне бы хотелось, чтобы в каждом исходном файле моего решения Visual C ++ 2005 отображалось следующее:

  #define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
  #define new DEBUG_NEW

Есть ли способ сделать это, не копируя его вручную? Опция компилятора?

Ответы [ 6 ]

5 голосов
/ 25 августа 2009

Параметр командной строки /D может использоваться для определения символов препроцессора. Однако я не знаю, можно ли его также использовать для определения макросов с аргументами, но это должно быть легко проверить.

Редактировать: в противном случае опция /FI («принудительное включение») позволит вам делать то, что вы хотите. Цитирование документации MSDN :

Этот параметр действует так же, как и указание файла с двойными кавычками в директиве #include в первой строке каждого исходного файла [...].

Затем вы можете поместить #define в этот файл принудительного включения.

4 голосов
/ 25 августа 2009

Я бы посоветовал не использовать это #define. Переопределение new не переносимо, и если вы сделаете это таким образом, то впоследствии вы не сможете использовать что-либо, использующее размещение new. Если вы «форсируете» это #define до того, как файл #include вступит в силу вручную, вы рискуете несовместиться между файлами заголовков библиотеки и их исходными файлами, и вы получите «неожиданные» ошибки в файлах библиотеки, которые используют размещение new (часто классы шаблона / контейнера).

Если вы собираетесь переопределить new, то сделайте это явным и оставьте его в источнике.

2 голосов
/ 25 августа 2009

Вы можете вставить это #define в stdafx.h или common.h или любой другой заголовочный файл, который включается в каждый исходный файл.

1 голос
/ 27 октября 2009

Вы можете поместить #define s в файл h, но без установки #ifndef защиты в файл h. Затем #include файл в каждом из ваших исходных файлов.

Я не одобряю переопределение new, кстати.

1 голос
/ 25 августа 2009

Опция компилятора?

Да, вы можете настроить список define s в свойствах проекта (насколько я помню, в разделе «Препроцессор» или «Дополнительно»). Эти define s будут присутствовать в каждом исходном файле.

0 голосов
/ 20 апреля 2017

Вы можете просто определить свой собственный глобальный новый оператор где-нибудь в своем коде и скомпилировать его условно. Не забудьте включить все 4 варианта новых (обычный и массив один с nothrow и без) и два варианта удаления (обычный и массив один). В моем экземпляре Effective C ++, третье издание (глава 8) есть целая глава по этому вопросу

#ifdef MYDEBUG
void* operator new(std::size_t size) { <your code here> }
void operator delete(void* p) { <your code here> }
#endif
...