Возможно ли скрытое объявление в проекте?

В моем проекте 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 структура.

Другие вопросы по тегам