Кроме того, __LINE__
и __FILE__
, есть ли другие полезные предопределенные макросы, как __FUNCTION_NAME__
?
В противном случае, но Вы знаете о других прохладных/полезных определенных макросах (специально для отладки целей), я хотел бы услышать о них.
Некоторые спросили о платформе: я использую gcc/g ++ на MacOSX.
Я могу найти следующее (описания из черновика 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__
тоже круто, но пока не уверен, смогу ли я придумать, как его использовать :-).
На этой странице MSDN перечислены полный набор предопределенных макросов для MSVC .
Лично я считаю __ COUNTER __
довольно крутым.
Если я не ошибаюсь, __ func __
не является макросом. По сути, это имя, объявленное как static const char * const __func__ = "function_name";
в верхней части любой функции, в которой оно используется. И вы должны использовать __ func __
вместо чего-либо вроде __ FUNCTION_NAME __
, потому что __ func __
является частью стандарта C99.
Из gcc можно получить все обычные предопределенные макросы, например:
$ gcc -dM -E - < /dev/null
Конечно, это не включает специальные макросы, например:
__FILE__, __LINE__ and __FUNCTION__.
используйте 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 __
тоже круто, но не уверен, могу ли я думать об использовании для него еще: -).
Конкретный, который вы ищете, называется __ 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
и другие подобные глупости, но вы получаете общую идею.
Полезный список предварительно определенных макросов для идентификации компиляторов, операционных систем и архитектур можно найти здесь .