Может ли статическая функция вызываться через указатель на функцию в C?

Элементы внутри .track-container представляют собой строки inline-уровня в том же поле строки .

Поэтому их вертикальное выравнивание задается Свойство vertical-align :

Это свойство влияет на вертикальное позиционирование внутри строки строки ящиков, генерируемых элементом встроенного уровня.

По умолчанию его значение равно baseline:

Совместите базовую линию с базой исходного поля. Если поле не имеет базовой линии, выровняйте край нижнего края с базовым уровнем родителя.

В этом случае все они имеют базовые линии, которые вычисляются в соответствии с

Базовый уровень «встроенного блока» - это базовый уровень его последнего строкового поля в нормальном потоке, если он не имеет ни строк строки в потоке, либо если его свойство «переполнения» имеет вычисленное значение, отличное от ' видимый ', и в этом случае базовая линия - это край нижнего края.

Следующее изображение разъясняет, что происходит (красная линия является базовой линией):

enter image description here [/g13]

Следовательно, вы можете

  • Изменить вертикальное выравнивание элементов, например к top, middle или bottom
    .track-container > * {
      vertical-align: middle;
    }
    
    .track-container {
      padding: 0;
      width: 600px;
      height: 200px;
      border: 1px solid black;
      list-style-type: none;
      margin-bottom: 10px;
    }
    .position-data {
      overflow: none;
      display: inline-block;
      width: 12.5%;
      height: 200px;
      margin: 0;
      padding: 0;
      border: 1px solid black;
    }
    .current-position,
    .position-movement {
      height: 100px;
      width: 100%;
      margin: 0;
      padding: 0;
      border: 1px solid black;
    }
    .album-artwork {
      display: inline-block;
      height: 200px;
      width: 20%;
      border: 1px solid black;
    }
    .track-info {
      display: inline-block;
      padding-left: 10px;
      height: 200px;
      border: 1px solid black;
    }
    .track-container > * {
      vertical-align: middle;
    }
    1
    2
    fdasfdsa
    fdafdsa
  • Установите overflow элементов к чему-то другому, чем visible, например hidden или auto, так что их базовая линия будет их краем крайнего края.
    .track-container > * {
      overflow: hidden;
    }
    
    .track-container {
      padding: 0;
      width: 600px;
      height: 200px;
      border: 1px solid black;
      list-style-type: none;
      margin-bottom: 10px;
    }
    .position-data {
      overflow: none;
      display: inline-block;
      width: 12.5%;
      height: 200px;
      margin: 0;
      padding: 0;
      border: 1px solid black;
    }
    .current-position,
    .position-movement {
      height: 100px;
      width: 100%;
      margin: 0;
      padding: 0;
      border: 1px solid black;
    }
    .album-artwork {
      display: inline-block;
      height: 200px;
      width: 20%;
      border: 1px solid black;
    }
    .track-info {
      display: inline-block;
      padding-left: 10px;
      height: 200px;
      border: 1px solid black;
    }
    .track-container > * {
      overflow: hidden;
    }
    1
    2
    fdasfdsa
    fdafdsa
  • Убедитесь, что в элементах нет строки с потоком, поэтому их базовая линия будет их краем крайнего края. То есть содержимое должно быть из потока : элемент называется out of flow , если он плавает, абсолютно позиционируется или является корневым элементом. Элемент называется in-flow , если он не выходит за пределы потока. Так, например, вы можете поместить содержимое элементов в оболочку и стилизовать его с помощью float: left:
    .track-container > * > .wrapper {
      float: left;
    }
    
    .track-container {
      padding: 0;
      width: 600px;
      height: 200px;
      border: 1px solid black;
      list-style-type: none;
      margin-bottom: 10px;
    }
    .position-data {
      overflow: none;
      display: inline-block;
      width: 12.5%;
      height: 200px;
      margin: 0;
      padding: 0;
      border: 1px solid black;
    }
    .current-position,
    .position-movement {
      height: 100px;
      width: 100%;
      margin: 0;
      padding: 0;
      border: 1px solid black;
    }
    .album-artwork {
      display: inline-block;
      height: 200px;
      width: 20%;
      border: 1px solid black;
    }
    .track-info {
      display: inline-block;
      padding-left: 10px;
      height: 200px;
      border: 1px solid black;
    }
    .track-container > * > .wrapper {
      float: left;
    }
    1
    2
    fdasfdsa
    fdafdsa

28
задан AnkurVj 5 November 2011 в 20:54
поделиться

4 ответа

Да, вы можете экспортировать статические функции, передавая им указатели. Это обычный способ реализации шаблона Factory в C, где вы можете скрыть реализации целого набора функций от модулей, которые их используют, и иметь FuncPtr_t GetFunction( enum whichFunctionIWant), который раздает их потребителям. , Вот сколько работает динамических линковок .

31
ответ дан Crashworks 5 November 2011 в 20:54
поделиться

Как уже упоминалось, вы можете сделать это. Примером того, почему вы можете захотеть, является своего рода «драйвер». Вы можете передать обратно структуру, содержащую функции open, close, read и write, не делая общедоступными фактические функции.

4
ответ дан Richard Pennington 5 November 2011 в 20:54
поделиться

Да, вы можете. Если вам нужно вызвать функцию, которая ожидает указатель на функцию в качестве обратного вызова, вы можете использовать static, чтобы символ функции не загрязнял глобальное пространство имен и не вызывал конфликты компоновщика. Наиболее часто используемый пример - это qsort:

struct Data { ... };

static int compareData(const void* a, const void* b) { /* cast to Data and compare */ }

...
qsort(array, count, sizeof(Data), &compareData);
3
ответ дан zeuxcg 5 November 2011 в 20:54
поделиться

Да, вы всегда можете попробовать сами и узнать:

file1.c

#include <stdio.h>

void call_hello(void (*fptr)(void));

static void hello(void) {
   puts("hello");
}

int main(void)
{
   void (*fptr)(void) = hello;

   call_hello(fptr);

   return 0;
}

file2.c

void call_hello(void (*fptr)(void))
{
   fptr();
}
0
ответ дан AusCBloke 5 November 2011 в 20:54
поделиться
Другие вопросы по тегам:

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