До недавнего времени (я заметил проблему в середине 2005 года) можно было использовать:
static const char sccs[] = "@(#)%W% %E%";
или что-то подобное в исходном коде и GCC, и большинство других компиляторов не оптимизируют его. Начиная с выпуска GCC примерно с того времени (вероятно, GCC 4.0.x, созданного в апреле 2005 года), эти постоянные строки были исключены из двоичных файлов. Итак, мне пришлось изменить исходный код, чтобы переменные были видны извне. Компилятор не может просмотреть только объектный файл и сделать вывод, что строка не используется, потому что что-то вне файла может предположительно ссылаться на него. Итак, мои файлы теперь содержат:
#ifndef lint
extern const char jlss_id_filename_c[];
const char jlss_id_filename_c[] = "@(#)$Id$";
#endif /* lint */
ОК - это гибрид; Я действительно использую RCS для хранения исходного кода, но я все еще предпочитаю what
- ident
для идентификации файлов - плюс у меня есть собственный взломанный what
, который делает и 1010 *, и ident
плюс несколько настроек моего своя. Но у меня есть объявление в некоторых файлах - не во всех - и определение во всех файлах. (При некотором наборе флагов предупреждений, которые сейчас не запоминаются, я получал предупреждения, когда переменная была определена до ее объявления. Возможно, это было изменение в GCC, которое решило эту проблему; я больше не уверен.)
Когда я создаю новый файл, мой генератор шаблонов заменяет «filename_c» на соответствующее имя генерируемого файла. Аналогично для заголовков - хотя строка идентификации встроена только в один файл, чтобы избежать нескольких определений.
Я предпочел старую систему со статическими константами - но это работало для меня более 3 лет.