Лучше использовать C пустые аргументы “пустое нечто (пусто)” или не “пустое нечто ()”? [дубликат]

вложенные div не могут быть размещены независимо. Есть два отдельных элемента. рассмотрим следующее.

announce {
  height: 45px;
  width: 100%;
  position: relative;
}

.header {
  position: absolute;
  height: 130px;
  background: blue;
  width: 100%;
  bottom: 0;
}
<div class="announce">
  This is some announcement
</div>
 <div class="header">
  <img src="img/logo.png">
</div>

200
задан Ciro Santilli 新疆改造中心法轮功六四事件 24 April 2016 в 21:36
поделиться

3 ответа

void foo(void);

Это - корректный способ не сказать "параметры" в C, и он также работает в C++.

Но:

void foo();

Разные вещи средств в C и C++! В C это означает, "мог взять любое количество параметров неизвестных типов", и в C++ это означает то же как foo(void).

Функции списка аргумента переменной по сути небезопасны с точки зрения типов и должны избежаться, если это возможно.

238
ответ дан Daniel Earwicker 23 November 2019 в 05:07
поделиться

Существует два пути к определению параметров в C. Каждый использует список идентификаторов, и другой использует список типов параметра. Список идентификаторов может быть опущен, но список типов не может. Так, чтобы сказать, что одна функция не берет аргументов в функциональном определении, Вы делаете это с (опущенным) списком идентификаторов

void f() {
    /* do something ... */
}

И это со списком типов параметра:

void f(void) {
    /* do something ... */
}

Если в списке типов параметра единственный один тип параметра является пустым (он не должен иметь никакого имени затем), то это означает, что функция не берет аргументов. Но те два способа определить функцию имеют различие относительно того, что они объявляют.

Списки идентификаторов

Первое определяет это, функция берет определенное количество аргументов, но ни количество не передается, ни типы того, что необходимо - как со всеми объявлениями функции то использование списки идентификаторов. Таким образом, вызывающая сторона должна знать типы и количество точно заранее. Таким образом, если вызывающая сторона вызывает функцию, дающую его некоторый аргумент, поведение не определено. Стек мог стать поврежденным, например, потому что вызванная функция ожидает другое расположение, когда это получит контроль.

Используя списки идентификаторов в параметрах функции удерживается от использования. Это использовалось в былые времена и все еще присутствует в большом количестве производственного кода. Они могут вызвать серьезную опасность из-за тех продвижений аргумента (если продвинутый тип аргумента не соответствует типу параметра функционального определения, поведение не определено также!) и намного менее безопасны, конечно. Поэтому всегда используйте void штука для функций без параметров, и в единственных объявлениях и в определениях функций.

Список типов параметра

Второй определяет это, функция берет нулевые аргументы и также передает это - как со всеми случаями, где функция объявляется с помощью списка типов параметра, который называют a prototype. Если вызывающая сторона вызывает функцию и дает ей некоторый аргумент, который является ошибкой, и компилятор выкладывает соответствующую ошибку.

Второй способ объявить функцию обладает большим количеством преимуществ. Каждый, конечно - то, что сумма и типы параметров проверяются. Другое различие - то, что, потому что компилятор знает типы параметра, он может применить неявные преобразования аргументов типу параметров. Если никакой список типов параметра не присутствует, который не может быть сделан, и аргументы преобразовываются в продвинутые типы (который называют продвижением параметра по умолчанию). char станет int, например, в то время как float станет double.

Составной тип для функций

Между прочим, если файл содержит и опущенный список идентификаторов и список типов параметра, список типов параметра "победы". Тип функции в конце содержит прототип:

void f();
void f(int a) {
    printf("%d", a);
}

// f has now a prototype. 

Это вызвано тем, что оба объявления не говорят ничего противоречащего. Второе, однако, имело что-то для высказывания, кроме того. Который является, что один аргумент принят. То же может быть сделано наоборот

void f(a) 
  int a;
{ 
    printf("%d", a);
}

void f(int);

Первое определяет функцию с помощью списка идентификаторов, в то время как второе затем обеспечивает прототип для него, с помощью объявления, содержащего список типов параметра.

94
ответ дан Johannes Schaub - litb 23 November 2019 в 05:07
поделиться

void foo(void) лучше, потому что это явно говорит: никакие параметры не позволяются.

void foo() средства Вы могли (в соответствии с некоторыми компиляторами) отправляют параметры, по крайней мере, если это - объявление Вашей функции, а не ее определения.

18
ответ дан Uri 23 November 2019 в 05:07
поделиться
Другие вопросы по тегам:

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