Могут аргументы подписи основного в C++ иметь неподписанные спецификаторы и спецификаторы константы? [дубликат]

Похоже, вы пытаетесь решить проблему, которая пытается научить вас дескрипторам. Посмотрите https://docs.python.org/3.7/howto/descriptor.html для получения более подробной информации.

Но все, что нужно для задачи, для которой вы пишете решение:

class Celsius:
    def __get__(self, obj, objtype):
        return ((obj.fahrenheit - 32) * 5) / 9

    def __set__(self, obj, celcius):
        obj.fahrenheit = ((celcius * 9) / 5) + 32


class Temperature:
    celcius = Celsius()

    def __init__(self, fahrenheit=0):
        self.fahrenheit = fahrenheit

Обратите внимание на несколько важных различий с вашим кодом:

  • Celcius создан и непосредственно назначается celcius в классе, а не атрибуту в экземпляре Temperature, как в вашем случае.
  • Дескриптор выполняет преобразование в обоих направлениях без осложнений для класса Temperature.
  • Большая часть дополнительного кода в вашей реализации ничего не делала; как правило, если вы добавляете код для решения проблемы, не оставляйте его, если он не решает проблему. Меньше значит больше в программировании.

24
задан Jonathan Leffler 14 September 2018 в 00:02
поделиться

7 ответов

Стандарт C ++ 98 говорит в разделе 3.6.1 параграф 2

Реализация не должна предопределять основную функцию. Эта функция не должна быть перегружена. Он должен иметь возвращаемый тип type int, но в остальном его тип определяется реализацией. Все реализации должны допускать оба следующих определения main: int main() и int main(int argc, char* argv[])

. Таким образом, согласно стандарту, ENV, принимающий main, не является приемлемым, но допустимым.


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

Программа должна содержать глобальную функцию, называемую main, которая является назначенное начало программы. Это реализация, определяемая, требуется ли программе в автономной среде для определения главной функции. [Примечание: в автономной среде запуск и завершение определяются реализацией; автозагрузка содержит выполнение конструкторов для объектов области пространства имен со статической длительностью хранения; Завершение содержит выполнение деструкторов для объектов со статической длительностью хранения. ]

33
ответ дан Motti 28 November 2019 в 22:56
поделиться

Указатели argv не должны быть const char* const, потому что программе разрешено изменять буферы.

2
ответ дан i_am_jorf 28 November 2019 в 22:56
поделиться

Это может не сработать, если компилятор использует преобразование имен для main. В конце концов, это функция C ++. Следовательно, компоновщик будет искать два конкретных "искажения". Ваше определение будет иметь другое искаженное имя.

Обратите внимание, что main является специальным (не перегружается, не вызывается) и может вообще не требовать искажения имени.

1
ответ дан MSalters 28 November 2019 в 22:56
поделиться

ISO / IEC 9899: TC3

Раздел 5.1.2.2.1 Запуск программы

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

int main(void) { /* ... */ }

или с двумя параметрами (именуемыми здесь как argc и argv, хотя могут использоваться любые имена, так как они являются локальными для функция, в которой они объявлены):

int main(int argc, char *argv[]) { /* ... */ }

или эквивалентный; 9) или каким-либо другим образом, определяемым реализацией.

0
ответ дан thkala 28 November 2019 в 22:56
поделиться

Вы должны использовать одну из стандартных подписей, чтобы соответствовать стандарту.

Я полностью понимаю, почему вы хотите поступать по-своему. Лучший способ - написать свою собственную функцию myMain () или что-то еще с нужной подписью и вызвать ее из main (), включая необходимые преобразования.

19
ответ дан 28 November 2019 в 22:56
поделиться

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

1
ответ дан 28 November 2019 в 22:56
поделиться

Вы можете быть незаконным по стандарту, но большинству сред выполнения это не важно. Они просто вставят целое число для argc и указатель на argv , вызовут ваш main и надеются, что вы правильно их проанализируете. Итак, в вашей компетенции "гарантированная работа" является спорным вопросом, поскольку загрузчику действительно все равно, какие аргументы вы объявили.

Если он построит, будет вызван main . Как разбирать аргументы - решать вам. Я должен уточнить, что это в значительной степени зависит от платформы, как и почти весь этот вопрос.

Тем не менее, почему?

0
ответ дан 28 November 2019 в 22:56
поделиться
Другие вопросы по тегам:

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