Во-первых, стандарты кодирования компании, возможно, тратят впустую пространство.Если вы собираетесь это сделать, то вместо массива char *
используйте массив, чтобы хранить только данные, а не указатель и данные:
static const char one_time_param[] = "ABCDEFG";
Далее, предположительно, это для идентификации файла.- по крайней мере, это то, для чего я его использую.Есть несколько вещей, о которых нужно знать, извлеченных из опыта в течение ряда лет.(Мне все еще нравится вставлять номера версий в исходные файлы - из-за этого я не полностью перешел на DVCS.)
- Чтобы избежать предупреждений, необходимо сделать символы видимыми снаружифайл.
- Это, в свою очередь, означает, что вы должны сделать имена переменных уникальными.
В настоящее время я использую имена на основе имени файла: jlss_id_filename_c[]
и т. д.
#ifndef lint
/* Prevent over-aggressive optimizers from eliminating ID string */
const char jlss_id_errno_c[] = "@(#)$Id: errno.c,v 3.3 2011/09/07 22:33:45 jleffler Exp $";
#endif /* lint */
Компилятор AT & T SVR4 C и программное обеспечение поддержки поддерживали директиву #ident
:
#ident "@(#)$Id: errno.c,v 3.3 2011/09/07 22:33:45 jleffler Exp $"
Компилятор включил строки в раздел «комментарии» вобъектный файл и инструмент (mcs
) для управления разделом комментариев (опции -d
для его удаления и -c
для его сжатия, IIRC).Этот раздел был частью двоичного файла, но не загружался в память во время выполнения.
В какой-то момент эволюции GCC, в сочетании с параметрами командной строки, которые я использовал, я получал предупреждения, если толькоЯ объявил и определил переменную, поэтому мой «шаблон» для нового исходного файла генерирует:
#ifndef lint
/* Prevent over-aggressive optimizers from eliminating ID string */
extern const char jlss_id_filename_c[];
const char jlss_id_filename_c[] = "@(#)$Id$";
#endif /* lint */
Однако я обычно удаляю объявление в эти дни и не получаю предупреждения компилятора.
В качестве альтернативы использованию имени файла в качестве основы для имени переменной вы можете сгенерировать имя UUID или GUID в шестнадцатеричном формате и использовать его в качестве имени переменной с префиксом для обеспечения первого символаявляется буквенным.
В заголовках вы не хотите, чтобы этот материал определялся в каждом исходном файле, который включает заголовок, потому что (a) он становится заметным (но не обязательно значительным) накладными расходами наразмер программы, и (b) вы не можете многократно определять глобальные переменные (вы можете многократно объявлять их; это не проблема).Итак, у моих заголовков есть строфа типа:
#ifdef MAIN_PROGRAM
#ifndef lint
/* Prevent over-aggressive optimizers from eliminating ID string */
const char jlss_id_stderr_h[] = "@(#)$Id: stderr.h,v 10.3 2011/11/28 04:49:24 jleffler Exp $";
#endif /* lint */
#endif
Затем, когда я хочу, чтобы заголовки определяли значения, у меня есть #define MAIN_PROGRAM
вверху соответствующего исходного файла.Например, при запуске what errno
в программе с таким именем я получаю вывод:
errno:
$Id: errno.c,v 3.3 2011/09/07 22:33:45 jleffler Exp $
$Id: range.h,v 1.8 2008/02/11 07:39:36 jleffler Exp $
$Id: stderr.h,v 10.3 2011/11/28 04:49:24 jleffler Exp $
$Id: errhelp.c,v 8.5 2009/03/02 19:13:51 jleffler Exp $
$Id: range2.c,v 1.8 2008/02/11 08:44:50 jleffler Exp $
$Id: stderr.c,v 10.7 2011/11/28 04:49:24 jleffler Exp $
stderr.c configured with USE_STDERR_FILEDESC
stderr.c configured with USE_STDERR_SYSLOG
Old-style
Это полный (иочень полезная) программа, иллюстрирующая старый стиль ведения бизнеса.
/*
@(#)File: $RCSfile: al.c,v $
@(#)Version: $Revision: 1.4 $
@(#)Last changed: $Date: 1996/08/13 11:14:15 $
@(#)Purpose: List arguments one per line
@(#)Author: J Leffler
@(#)Copyright: (C) JLSS 1992,1996
@(#)Product: :PRODUCT:
*/
/*TABSTOP=4*/
#include <stdio.h>
#include <stdlib.h>
#ifndef lint
static const char sccs[] = "@(#)$Id: al.c,v 1.4 1996/08/13 11:14:15 johnl Exp $";
#endif
int main(int argc, char **argv)
{
while (*++argv)
puts(*argv);
return(EXIT_SUCCESS);
}
Примечание: при компиляции строка версии не включается в двоичный файл (или объектный файл).В настоящее время это не дает мне никакого предупреждения при компиляции с GCC 4.6.1, скомпилированной в MacOS X 10.7.2:
gcc -m64 -g -O -std=c99 -pedantic -Wall -Wshadow -Wpointer-arith -Wcast-qual \
-Wstrict-prototypes -Wmissing-prototypes -o al al.c
Когда я запускаю what al
, я не получаю идентификационный вывод.