Почему статический элемент данных не мог бы быть инициализирован?

Для версий до 2,5, существует прием:

[expression] and [on_true] or [on_false]

Это может дать неправильные результаты, когда on_true имеет ложное булево значение. 1 глоток>
, Хотя это действительно обладает преимуществом оценки выражений слева направо, который более ясен, по-моему.

1. там эквивалент C’s ”?: Тернарный оператор ”?

6
задан Andrew 19 August 2009 в 16:03
поделиться

6 ответов

Обычно со статическими библиотеками компоновщик извлекает файлы .o только из той библиотеки, на которую ссылается основная программа. Поскольку вы не ссылаетесь на MiataCreator :: register или что-то еще в Miata.cpp, но полагаетесь на статическую инициализацию, компоновщик даже не включит этот код в ваш exe, если он связан из статической библиотеки -

Проверьте полученный исполняемый файл с помощью nm или objdump (или dumpbin, если вы работаете в Windows), действительно ли код для MiataCreator :: Register включен в exe-файл при статической компоновке.

Я не знаю, как заставить компоновщик включать все кусочки статической библиотеки ..

зарегистрирован (определен в Miata.cpp) для инициализации перед первым вызовом MyFactory :: create_car (определен в MyFactory.cpp).

Как и все неопределенное поведение, иногда вы получаете то, что хотите, а иногда вы выигрываете 't, и самые странные, казалось бы, не связанные между собой вещи (такие как статическая или динамическая компоновка) могут измениться, работает ли она так, как вы хотите, или нет.

Что вам нужно сделать, так это создать статический метод доступа для зарегистрированного флага который определен в Miata.cpp, и фабрика MyFactory получает значение через этот метод доступа. Поскольку метод доступа находится в той же единице трансляции, что и определение переменной, переменная будет инициализирована к моменту запуска метода доступа. Затем вам нужно откуда-то вызвать этот аксессор.

cpp) вызывается впервые.

Как и все неопределенное поведение, иногда вы получаете то, что хотите, а иногда - нет, и самые странные, казалось бы, не связанные между собой вещи (например, статическое или динамическое связывание) могут измениться независимо от того, работает ли он так, как вы этого хотите.

Что вам нужно сделать, так это создать статический метод доступа для зарегистрированного флага, который определен в Miata.cpp, и заставить фабрику MyFactory получить значение через этот метод доступа. Поскольку метод доступа находится в той же единице трансляции, что и определение переменной, переменная будет инициализирована к моменту запуска метода доступа. Затем вам нужно откуда-то вызвать этот аксессор.

cpp) вызывается впервые.

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

Что вам нужно сделать, так это создать статический метод доступа для зарегистрированного флага, который определен в Miata.cpp, и заставить фабрику MyFactory получить значение через этот метод доступа. Поскольку метод доступа находится в той же единице трансляции, что и определение переменной, переменная будет инициализирована к моменту запуска метода доступа. Затем вам нужно откуда-то вызвать этот аксессор.

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

Вам нужно создать статический метод доступа для зарегистрированного флага, который определен в Miata.cpp, и пусть фабрика MyFactory получит значение через этот метод доступа. Поскольку метод доступа находится в той же единице трансляции, что и определение переменной, переменная будет инициализирована к моменту запуска метода доступа. Затем вам нужно откуда-то вызвать этот аксессор.

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

Вам нужно создать статический метод доступа для зарегистрированного флага, который определен в Miata.cpp и пусть фабрика MyFactory получит значение через этот метод доступа. Поскольку метод доступа находится в той же единице трансляции, что и определение переменной, переменная будет инициализирована к моменту запуска метода доступа. Затем вам нужно откуда-то вызвать этот аксессор.

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

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

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

Когда вы проверяете, находится ли элемент miata внутри карты? это до или после основного?
Единственная причина, по которой я мог придумать, - это доступ к элементам карты перед main () (например, при глобальной инициализации), которая может иметь место до создания MiataCreator :: Register (если он находится в другой единице перевода)

0
ответ дан 8 December 2019 в 18:39
поделиться

Лично я считаю, что вы ошибаетесь с компоновщиком.

Не используются логические переменные 'bool MiataCreator :: register', потому что компоновщик не извлекает их из библиотеки в библиотеку. исполняемый файл (помните, что если в исполняемом файле нет ссылки на функцию / глобал, компоновщик не будет извлекать их объект из библиотеки [он ищет только объекты, которые в настоящее время не определены в исполняемом файле])

Вы можете добавить несколько операторов печати в 'bool MiataCreator :: register_with_factory ()', чтобы узнать, вызывается ли он когда-либо. Или проверьте символы в исполняемом файле, чтобы убедиться, что он там есть.

Некоторые вещи, которые я бы сделал:

// Return the factory by reference rather than pointer.
// If you return by pointer the user has to assume it could be NULL
// Also the way you were creating the factory the destructor was never
// being called (though not probably a big deal here) so there was no
// cleanup, which may be usefull in the future. And its just neater.
MyFactory& MyFactory::get_instance()
{
    static MyFactory   instance; /// Safe singleton 
    return instance;
}

Вместо двухэтапной инициализации объекта. Я подозреваю, что это не удается из-за компоновщика. Создайте экземпляр своей фабрики и попросите конструктор зарегистрировать его.

0
ответ дан 8 December 2019 в 18:39
поделиться

Если под статической компоновкой вы имеете в виду добавление всех объектных файлов (.o) в двоичный файл, это должно работать как динамический материал, если вы создали (.a) статическую библиотеку, компоновщик не будет связывать их внутри, поскольку связаны только используемые объекты внутри статической библиотеки, и в этом случае ни один из них не используется явно.

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

Но если вам не удается загрузить то, что когда-либо это не сработает, объединение объектных файлов вместе сработает, а также загрузка динамических библиотек, но статические библиотеки никогда не будут компоноваться без явных зависимостей.

если вы создали (.a) статическую библиотеку, компоновщик не будет связывать их внутри, поскольку связаны только используемые объекты внутри статической библиотеки, и в этом случае ни один из них не используется явно.

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

Но если вам не удастся загрузить то, что когда-либо это не сработает, объединение объектных файлов вместе сработает и также загрузит динамические библиотеки, но статические библиотеки никогда не будут компоноваться без явных зависимостей.

если вы создали (.a) статическую библиотеку, компоновщик не будет связывать их внутри, поскольку связаны только используемые объекты внутри статической библиотеки, и в этом случае ни один из них не используется явно.

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

Но если вам не удастся загрузить то, что когда-либо это не сработает, объединение объектных файлов вместе сработает и также загрузит динамические библиотеки, но статические библиотеки никогда не будут компоноваться без явных зависимостей.

как функция, которая создает объект и возвращает его по запросу.

Но если вам не удастся загрузить то, что когда-либо это не сработает, объединение объектных файлов вместе сработает и также загрузит динамические библиотеки, но статические библиотеки никогда не будут компоноваться без явных зависимостей.

как функция, которая создает объект и возвращает его по запросу.

Но если вам не удастся загрузить то, что когда-либо это не сработает, объединение объектных файлов вместе сработает и также загрузит динамические библиотеки, но статические библиотеки никогда не будут компоноваться без явных зависимостей.

o файлы из той библиотеки, на которую ссылается основная программа. Поскольку вы не ссылаетесь на MiataCreator :: register или что-то еще в Miata.cpp, но полагаетесь на статическую инициализацию, компоновщик даже не включит этот код в ваш exe, если он связан из статической библиотеки -

Проверьте полученный исполняемый файл с помощью nm или objdump (или dumpbin, если вы работаете в Windows), действительно ли код для MiataCreator :: Register включен в exe-файл при статической компоновке.

Я не знаю, как заставить компоновщик включать все элементы статической библиотеки ..

s связаны из статической библиотеки -

Проверьте полученный исполняемый файл с помощью nm или objdump (или dumpbin, если вы работаете в Windows), действительно ли код для MiataCreator :: register включен в exe-файл при статической компоновке.

Я не знаю, как заставить компоновщик включать все элементы статической библиотеки ..

s связаны из статической библиотеки -

Проверьте полученный исполняемый файл с помощью nm или objdump (или dumpbin, если вы работаете в Windows), действительно ли код для MiataCreator :: register включен в exe-файл при статической компоновке.

Я не знаю, как заставить компоновщик включать все элементы статической библиотеки ..

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

Я понял, что GDI + использует WIC для выполнения определенных задач. По крайней мере, в Windows 7.

Обратите внимание на следующий код:

image.Write(target, ImageFormat.Gif);

Когда я запускаю этот код под Windows XP, он будет использовать кодировщик GDI + Gif для записи изображения в формате Gif. Когда я запускаю тот же код под Windows 7, он будет использовать WIC Gif Encoder.

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

Но если вам не удастся загрузить то, что когда-либо это не сработает, объединение объектных файлов вместе сработает и также загрузит динамические библиотеки, но статические библиотеки никогда не будут компоноваться без явных зависимостей.

3
ответ дан 8 December 2019 в 18:39
поделиться

с GCC, вы можете добавить -WL, - весь архив mylib.a --wl, - нет-цельный архив . Это заставит линкер включить объекты, даже если не ссылаются. Это, однако, не портативно.

1
ответ дан 8 December 2019 в 18:39
поделиться
Другие вопросы по тегам:

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