Зачем вам предшествовать функции main () в C с типом данных? [Дубликат]

Вот способ Kotlin, чтобы сделать части кликабельными TextView:

private fun makeTextLink(textView: TextView, str: String, underlined: Boolean, color: Int?, action: (() -> Unit)? = null) {
    val spannableString = SpannableString(textView.text)
    val textColor = color ?: textView.currentTextColor
    val clickableSpan = object : ClickableSpan() {
        override fun onClick(textView: View) {
            action?.invoke()
        }
        override fun updateDrawState(drawState: TextPaint) {
            super.updateDrawState(drawState)
            drawState.isUnderlineText = underlined
            drawState.color = textColor
        }
    }
    val index = spannableString.indexOf(str)
    spannableString.setSpan(clickableSpan, index, index + str.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
    textView.text = spannableString
    textView.movementMethod = LinkMovementMethod.getInstance()
    textView.highlightColor = Color.TRANSPARENT
}

Его можно вызвать несколько раз, чтобы создать несколько ссылок в TextView:

makeTextLink(myTextView, str, false, Color.RED, action = { Log.d("onClick", "link") })
makeTextLink(myTextView, str1, true, null, action = { Log.d("onClick", "link1") })
13
задан Azeem 20 April 2018 в 11:56
поделиться

8 ответов

Следующее было допустимо в C89

main() {
  return 0;
}

Но в современном C (C99) это больше не разрешено, потому что вам нужно явно указать тип переменных и возвращаемый тип функций, так что он становится

int main() {
  return 0;
}

. Кроме того, в современном C допустимо опускать return 0 , поэтому допустимо писать

int main() {

}

И поведение такое, как если бы оно возвращало 0.

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

void f();
 /* defined as  void f(int a) { } later in a different unit */

int main() {
  f("foo");
}

Вызов f вызывает неопределенное поведение, потому что компилятор не может проверить тип аргумента на соответствие тому, что f ожидает в других модулях. Если бы вы написали его с помощью void или int , компилятор знал бы

void f(int); /* only int arguments accepted! */

int main(void) {
  f("foo"); /* 'char*' isn't 'int'! */
}

Так что для main просто хорошая привычка помещать void там, так как это хорошо сделать в другом месте. В C вам разрешено рекурсивно вызывать main , и в этом случае такие различия могут даже иметь значение.

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

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

12
ответ дан 1 December 2019 в 19:07
поделиться

Функция main возвращает целочисленный код состояния, который сообщает операционной системе, успешно ли завершилась программа.
return 0 указывает на успех; возврат любого другого значения указывает на сбой.

Поскольку это целое число, а не строка, оно возвращает int , а не char или char * . (Вызов printf не имеет ничего общего с возвратом из функции)

Старые версии C допускают тип возврата по умолчанию int .
Однако лучше явно указать тип возвращаемого значения.

В C (в отличие от C ++) функция, которая не принимает никаких параметров, объявляется как int myFunc ( void )

13
ответ дан 1 December 2019 в 19:07
поделиться

Это называется статусом выхода . Когда программа завершится, вы хотите сообщить вызываемому, как завершилась ваша программа. Если он завершился нормально, вы вернете 0 и т. Д.

Здесь вы можете узнать больше о статусах выхода.

5
ответ дан 1 December 2019 в 19:07
поделиться

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

2
ответ дан 1 December 2019 в 19:07
поделиться

«int» перед объявлением основной функции - это тип возвращаемого значения функции. То есть функция возвращает целое число.

Из функции вы можете вернуть часть данных. Обычно возвращается «0», если функция завершилась успешно. Любое другое число, до 255, возвращается, если программа не выполнялась успешно, чтобы показать произошедшую ошибку.

То есть вы возвращаете 0 с типом данных int, чтобы показать, что программа выполняется правильно.

1
ответ дан 1 December 2019 в 19:07
поделиться

Традиционно используется int main (int argc, char * argv []) , потому что целочисленный возврат может указывать на выполнение программы. Возврат 0 указывает на то, что программа выполнилась успешно, тогда как -1 указывает на то, что в ней произошел какой-то сбой. Обычно коды выхода очень специфичны и используются в качестве метода отладки, поскольку исключений (в смысле C ++) не существует в C.

1
ответ дан 1 December 2019 в 19:07
поделиться

Почему некоторые перед функцией main () ставят int как в:

В C (во всяком случае, C 89, это тот, на который вы, кажется, ссылаетесь), функции возвращают int по умолчанию, если им не предшествует какой-либо тип данных. Предшествовать ему с помощью int , в конечном счете, просто вопрос предпочтения.

Кроме того, я видел слово «void», введенное внутри (), например:

Это тоже в основном вопрос предпочтения, однако эти два совершенно разные :

f (void) означает, что функция f принимает ноль аргументов, а f () означает, что функция f принимает ] неуказанное количество аргументов .

f (void) - правильный способ объявить функцию, которая не принимает аргументов в C.

Кажется, лишняя типизация даром, но, может быть, это лучшая практика, которая приносит дивиденды в других ситуациях?

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

Кроме того, зачем перед main () ставить int если вы возвращаете символьную строку? Во всяком случае, можно было бы ожидать:

char main (void)

Что? зачем вам возвращать символьную строку из main ? Для этого нет абсолютно никаких причин ...

Кроме того, ваше объявление main возвращает символ, а не строку символов.

Я также не понимаю, почему мы возвращаем 0 в конце функции.

По завершении программа возвращает значение операционной системе. Это значение можно использовать для информирования ОС о некоторых вещах. Например, ваш антивирусный сканер может вернуть 1 , если вирус был обнаружен, 0 , если вирус не был обнаружен, и 2 , если произошла какая-то ошибка.Обычно 0 означает, что ошибки не было, и все прошло хорошо.

3
ответ дан 1 December 2019 в 19:07
поделиться

В большинстве операционных систем для приложений используются коды выхода. Обычно 0 - это код выхода для успешного выполнения (например, приложение успешно завершено). Возвращаемое значение main () - это то, что возвращается в ОС, поэтому main () обычно возвращает целое число (и поскольку 0 является успехом, большинство программ на C будут иметь возврат 0; в конце).

1
ответ дан 1 December 2019 в 19:07
поделиться
Другие вопросы по тегам:

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