Возможно ли скрытое объявление в проекте?
В моем проекте structre используется в нескольких функциях.
как это:
void function1 (Struct_type1 * pstType1);
но когда я ищу Struct_type1
ссылки, я не могу найти ни одного. Эта структура должна быть где-то определена. Как найти определение?
ОС-Windows
Edit: я думаю, что трудно ответить на это без исходного кода, и я не могу поделиться этим большим проектом здесь. Итак, я изменил свой вопрос на:
- Возможно ли скрытое объявление во встроенном проекте?
(Под скрытым я подразумеваю, что никто не может видеть определение.)
2 ответа
Не ответ, но, возможно, способ найти ответ. Идея: пусть компилятор вам поможет.
Определите структуру самостоятельно, затем посмотрите на ошибки компилятора, такие как "struct struct_type1 уже определена в... в строке..."
Если в этом случае вы не получите ошибку компилятора, возможно, структура объявлена только вперед, но не определена.
Чтобы объяснить, почему это иногда делается, здесь немного кода:
// Something.h
struct struct_type1; // Forward declaration.
struct struct_type1 *SomethingInit();
void SomethingDo( struct struct_type1 * context );
В коде, похожем на приведенное выше, определение структуры скрыто внутри реализации. Снаружи не нужно знать, как определяется структура или каков ее размер и т. Д., Поскольку она торгуется только как указатель на структуру (а не как значение). Этот метод используется для защиты внутренних типов от открытых заголовочных файлов и часто используется разработчиками библиотек. Вы можете думать об этом как о непрозрачной ручке сортов.
Но тогда вы все равно сможете найти предварительную декларацию, хотя и не определение.
Возможно ли скрытое объявление во встроенном проекте?
Если у вас есть доступ ко всему исходному коду в проекте, то нет.
Это возможно только в одном конкретном случае, а именно, когда у вас есть внешняя библиотека, для которой у вас нет кода C, у вас есть только файл заголовка и объектный файл или файл lib (или DLL и т. Д.).
В таких случаях возможно (и хорошая практика) для заголовка библиотеки заранее объявить неполный тип в заголовке и скрыть фактическую реализацию в C-файле, к которому у вас нет доступа.
Тогда у вас будет что-то вроде этого в файле h:
typedef struct Struct_type1 Struct_type1;
Компилятор часто может делать такие вещи со своими собственными библиотеками, если он хочет скрыть реализацию. Одним из таких примеров является FILE
структура.