Ответы пользователя по тегу C
  • Как узнать статичная ли функция по ELF файлу?

    hakain
    @hakain Автор вопроса
    Немного знаю С/С++, Qt, и микроконтроллеры
    Похоже я сам нашел ответ на вопрос. Если вызвать команду objdump с опцией -t, то можно увидеть следующий вывод.
    $ 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

    В моем случае видно, что строки имеют флаги l и g.
    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.

    По всей видимости static функции помечаются флагом l.
    Ответ написан
  • Как передать в функцию указатель на структуру, описанную в другом хедере?

    hakain
    @hakain
    Немного знаю С/С++, Qt, и микроконтроллеры
    Не знаю как другие, но лично я стараюсь не использовать extern'ы из-за того, что возникает путаница со структурами и переменными, когда она определена где то в дебрях файла foo.c, а используется в bar.c.
    Я стараюсь придерживаться модульного подхода, который может иметь примерно следующий вид.

    // 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); 
    }
    Ответ написан