C
0
Вклад в тег
$ objdump -t test | grep foo
0000000000000000 l df *ABS* 0000000000000000 foo.c
000000000000064e l F .text 0000000000000014 s_foo
000000000000063a g F .text 0000000000000014 foo
The symbol is a local (l), global (g), unique global (u), neither global nor local (a space) or both global and local (!).
A symbol can be neither local or global for a variety of reasons, e.g., because it is used for debugging,
but it is probably an indication of a bug if it is ever both local and global.
// point.c
/* определение */
struct point {
int x;
int y;
};
void init_point(struct point** p, const int x, const int y)
{
(*p)->x = x;
(*p)->y = y;
}
int get_x(struct point* p)
{
return p->x;
}
int get_y(struct point* p)
{
return p->y;
}
// ... тут может быть много логики ...
// point.h
/* объявление */
/* тут можно подумать, что это инкапсуляция, но это обман зрения.
* на самом деле это просто аля сокрытие данных */
struct point;
// интерфейс
void init_point(struct point** p, const int x, const int y);
int get_x(struct point* p);
int get_y(struct point* p);
// ... ect ...
// main.c
#include "point.h"
int main()
{
struct point* p;
init_point(&p, 1, 1);
p->x; // ошибка
// в других файлах так же изменение и чтение данных производим с помощью функций, а напрямую поля структуры недоступны
const int x = get_x(p);
}