Произвести штамп времени компиляции в исполняемом файле Visual C++?

Спасибо за ответ @srohde. У этого есть небольшая ошибка проверки для символа новой строки с оператором 'is', и я не мог прокомментировать ответ с 1 репутацией. Кроме того, мне бы хотелось, чтобы файл был открыт снаружи, потому что это позволяет мне вставлять мои провалы для задач luigi.

То, что мне нужно было изменить, имеет форму:

with open(filename) as fp:
    for line in fp:
        #print line,  # contains new line
        print '>{}<'.format(line)

d любить меняться на:

with open(filename) as fp:
    for line in reversed_fp_iter(fp, 4):
        #print line,  # contains new line
        print '>{}<'.format(line)

Вот измененный ответ, который требует дескриптора файла и сохраняет символы новой строки:

def reversed_fp_iter(fp, buf_size=8192):
    """a generator that returns the lines of a file in reverse order
    ref: https://stackoverflow.com/a/23646049/8776239
    """
    segment = None  # holds possible incomplete segment at the beginning of the buffer
    offset = 0
    fp.seek(0, os.SEEK_END)
    file_size = remaining_size = fp.tell()
    while remaining_size > 0:
        offset = min(file_size, offset + buf_size)
        fp.seek(file_size - offset)
        buffer = fp.read(min(remaining_size, buf_size))
        remaining_size -= buf_size
        lines = buffer.splitlines(True)
        # the first line of the buffer is probably not a complete line so
        # we'll save it and append it to the last line of the next buffer
        # we read
        if segment is not None:
            # if the previous chunk starts right from the beginning of line
            # do not concat the segment to the last line of new chunk
            # instead, yield the segment first
            if buffer[-1] == '\n':
                #print 'buffer ends with newline'
                yield segment
            else:
                lines[-1] += segment
                #print 'enlarged last line to >{}<, len {}'.format(lines[-1], len(lines))
        segment = lines[0]
        for index in range(len(lines) - 1, 0, -1):
            if len(lines[index]):
                yield lines[index]
    # Don't yield None if the file was empty
    if segment is not None:
        yield segment
17
задан Coding Mash 1 September 2012 в 22:58
поделиться

6 ответов

Хотя не Ваш точный формат, ДАТА будет иметь формат Mmm dd yyyy, в то время как ВРЕМЯ будет иметь формат hh:mm:ss. Можно создать строку как это и использовать ее в любой стандартной программе печати, имеет смысл для Вас:

const char *buildString = "This build XXXX was compiled at " __DATE__ ", " __TIME__ ".";

(Примечание по другому ответу: МЕТКА ВРЕМЕНИ только выкладывает дату/время модификации исходного файла, не дату/время сборки.)

19
ответ дан 30 November 2019 в 11:53
поделиться
__DATE__ 
__TIME__

предопределены, поскольку часть стандартов для C99 так должна быть доступна Вам. Они работают однажды с препроцессором.

8
ответ дан 30 November 2019 в 11:53
поделиться

Хорошо... для Visual C++, существует созданный в символе, названном __ImageBase. Конкретно:

EXTERN_C IMAGE_DOS_HEADER __ImageBase;

можно осмотреть это во времени выполнения для определения метки времени в заголовке PE:

const IMAGE_NT_HEADERS *nt_header= (const IMAGE_NT_HEADERS *)((char *)&__ImageBase + __ImageBase.e_lfanew);

И использование nt_header->FileHeader.TimeDateStamp для получения метки времени, которая является секундами с 01.01.1970.

5
ответ дан 30 November 2019 в 11:53
поделиться

__TIME__ и __DATE__ может работать, однако существуют некоторые сложности.

, Если Вы помещаете эти определения в.h файл и включаете определения из нескольких .c/.cpp файлов, каждый файл будет иметь различную версию даты/времени на основе того, когда это будет скомпилировано. Таким образом, если Вы надеетесь использовать дату/время в двух различных местах, и они должны всегда соответствовать, Вы в беде. При выполнении возрастающей сборки один из файлов может быть восстановлен, в то время как другой не, который снова приводит к меткам времени, которые могли дико отличаться.

А немного лучший подход должен сделать GetBuildTimeStamp () прототипами в.h файле и поместить __TIME__ и __DATE__ макросы в реализации (.c/.cpp) файл. Таким образом, можно использовать метки времени в нескольких местах в коде, и они будут всегда соответствовать. Однако необходимо удостовериться, что .c/.cpp файл восстановлен каждый раз, когда сборка выполняется. При выполнении чистых сборок тогда, это решение может работать на Вас.

при выполнении возрастающих сборок, тогда необходимо удостовериться, что штамп сборки обновляется на каждой сборке. В Visual C++ можно сделать это с шагами PreBuild - однако в этом случае я рекомендовал бы вместо того, чтобы использовать __DATE__ и __TIME__ в скомпилированном .c/.cpp файле, использовать основанный на тексте файл, который читается во времени выполнения во время осуществления программы. Это делает его быстро для Вашего сценария сборки для обновления метки времени (никакая компиляция или требуемое соединение) и не требует, чтобы шаг PreBuild понял флаги компилятора или опции.

4
ответ дан 30 November 2019 в 11:53
поделиться

Я думаю, предложенные решения для использования ДАТА , ВРЕМЯ или , МЕТКА ВРЕМЕНИ была бы достаточно хороша. Я действительно рекомендую овладеть сенсорной программой для включения в шаг перед сборкой для касания файла, который содержит использование переменной препроцессора. Касание файла удостоверяется, что его метка времени является более новой, чем, в то время, когда оно было в последний раз скомпилировано. Тем путем дата/время в скомпилированном файле изменяется также с каждым, восстанавливают.

1
ответ дан 30 November 2019 в 11:53
поделиться

Visual C ++ также поддерживает __TIMESTAMP__, что почти то, что вам нужно. Тем не менее, сложная часть о временных метках сборки - поддерживать их в актуальном состоянии, что означает компиляцию файла, в котором __TIMESTAMP__ используется при каждой перестройке. Не уверен, что есть способ настроить это в Visual C ++.

-1
ответ дан 30 November 2019 в 11:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: