C/C++ прохладные макроопределения?

Кроме того, __LINE__ и __FILE__, есть ли другие полезные предопределенные макросы, как __FUNCTION_NAME__?

В противном случае, но Вы знаете о других прохладных/полезных определенных макросах (специально для отладки целей), я хотел бы услышать о них.

Некоторые спросили о платформе: я использую gcc/g ++ на MacOSX.

5
задан Jonathan Leffler 21 March 2015 в 00:45
поделиться

6 ответов

Я могу найти следующее (описания из черновика C99, но они есть и в C89, я думаю):

  • __DATE__: Дата перевода блока препроцессингового перевода: символ строковый литерал формы "Mmm dd yyyy", в котором названия месяцы совпадают с месяцами, генерируемыми функцией asctime , а также первый символ dd - это знак пробела, если значение меньше 10. Если дата перевода недоступна, дата вступления в силу, определенная в реализации должно быть поставлено.
  • __TIME__: Время перевода блока препроцессингового перевода: символ строковый литерал формы "hh:mm:ss", как и во времени, генерируемый asctime function. Если время перевода недоступно, то функция asctime. должно быть предоставлено действительное время, определенное в ходе реализации.

Для текущего имени функции C99 определяет __func__, однако __FUNCTION_NAME__ не является стандартным макросом. Кроме того, __func__ не является макросом, это зарезервированный идентификатор (6.4.2.2p1):

Идентификатор __func__ должен быть имплицитно объявлен переводчиком как бы, непосредственно после открывающей скобки определения каждой функции появилось объявление

static const char __func__[] = "function-name";

, где function-name является именем лексически закрывающей функции.

Если вы ищете что-то специфическое для платформы: вот список общих предопределенных макросов gcc. Мне нравится __COUNTER__, это уникальное, последовательное целое число, начинающееся с 0. Я думаю __INCLUDE_LEVEL__ тоже круто, но пока не уверен, смогу ли я придумать, как его использовать :-).

7
ответ дан 18 December 2019 в 13:13
поделиться

На этой странице MSDN перечислены полный набор предопределенных макросов для MSVC .

Лично я считаю __ COUNTER __ довольно крутым.

2
ответ дан 18 December 2019 в 13:13
поделиться

Если я не ошибаюсь, __ func __ не является макросом. По сути, это имя, объявленное как static const char * const __func__ = "function_name"; в верхней части любой функции, в которой оно используется. И вы должны использовать __ func __ вместо чего-либо вроде __ FUNCTION_NAME __ , потому что __ func __ является частью стандарта C99.

1
ответ дан 18 December 2019 в 13:13
поделиться

Из gcc можно получить все обычные предопределенные макросы, например:

$ gcc -dM -E - < /dev/null

Конечно, это не включает специальные макросы, например:

__FILE__, __LINE__ and __FUNCTION__.
0
ответ дан 18 December 2019 в 13:13
поделиться

Общие макросы GCC .

2
ответ дан 18 December 2019 в 13:13
поделиться

используйте os.path.join () для построения ваших путей - Это аккуратнее:

import os
import sys
rootdir = sys.argv[1]
for root, subFolders, files in os.walk(rootdir):
    for folder in subFolders:
        outfileName = os.path.join(root,folder,"py-outfile.txt")
        folderOut = open( outfileName, 'w' )
        print "outfileName is " + outfileName
        for file in files:
            filePath = os.path.join(root,file)
            toWrite = open( filePath).read()
            print "Writing '" + toWrite + "' to" + filePath
            folderOut.write( toWrite )
        folderOut.close()
-121--639560-

Я могу найти следующие (описания из C99 черновика, но они доступны в C89 тоже я думаю):

  • __ DATE __ : дата перевода блока перевода предварительной обработки: символ строковый литерал формы «Mmm dd yyyy», где имена месяцы совпадают с месяцами, сгенерированными функцией asctime , и первый символ dd - символ пробела, если значение меньше 10. Если дата перевода недоступна, дата действия, определенная реализацией должны поставляться.
  • __ TIME __ : время перевода блока перевода предварительной обработки: символ строковый литерал вида «hh: mm: ss», как в момент времени, сгенерированный Функция asctime . Если время перевода недоступно, должно быть указано допустимое время реализации.

Для текущего имени функции C99 определяет __ func __ , но __ FUNCTION _ NAME __ не является стандартным макросом. Кроме того, __ func __ не является макросом, это зарезервированный идентификатор (6,4,2 .2p1):

Идентификатор __ func __ должен быть неявно объявлен переводчиком как, сразу же после открывающей скобки каждого определения функции появилось объявление

static const char __ func __ [] = « function-name »;

, где function-name - имя лексически охватывающей функции.

Если вы ищете что-то специфичное для платформы: вот список стандартных макросов gcc . Мне нравится __ СЧЕТЧИК __ , который является уникальным, последовательным целым числом, начинающимся с 0. Я думаю, что __ INCLUDE _ LEVEL __ тоже круто, но не уверен, могу ли я думать об использовании для него еще: -).

-121--4667602-

Конкретный, который вы ищете, называется __ func __ , но это не совсем макрос, так как его значение меняется в зависимости от того, где он виден. Однако это полезно и выглядит как макро.

Мой любимый макрос в данный момент __ STDC_VERSION __ , потому что он позволяет мне сделать это:

#if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L
# define inline
# define register
# if __GNUC__ >= 2 || _MSC_VER >= 1300
#  define __func__ __FUNCTION__
# else
#  define __func__ "<unknown>"
# endif
#endif

Теперь вы можете использовать ключевые слова C99 действующий , регистр , и __ func __ , чтобы объявить вещи, не имея необходимость волноваться о том, используете ли компилятор вы поддержки это функциональность C99! В реальности бит для inline более сложен, так как некоторые компиляторы определяют __ inline и другие подобные глупости, но вы получаете общую идею.

Полезный список предварительно определенных макросов для идентификации компиляторов, операционных систем и архитектур можно найти здесь .

2
ответ дан 18 December 2019 в 13:13
поделиться