Что подразумевается под «использованием функции» - PullRequest
3 голосов
/ 26 августа 2010

$ 3,6,1 / 3 штатов-

"Функция main не должна использоваться (3.2) внутри программы. ".

Пример программы , основанной на академической мотивации, ниже использует имя «main» несколькими способами, которые я считаю законными. Это основано на предположении, что «использование функции» связано с вызовом функции (прямо / косвенно).

struct MyClass{ 
private: 
   MyClass(){}  
   friend int main(); 
};   

int main(){  
   MyClass m;  
   int (*p)() = main; // but don't do anything 
}
  1. Справедливо, приведенный код компилируется с gcc / VS 2010.

  2. Я удивлен ошибкой Комо.

Comeau online выдает ошибку при объявлении «p» (т.е. при получении адреса «main»), но не при объявлении «main» в качестве друга.

Кто / Что правильно по отношению к C ++ 03?

Ответы [ 4 ]

6 голосов
/ 26 августа 2010

C ++ 03 §3.2 / 2 говорит:

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

Далее перечисляется, что составляет использование других различных типов объектов;здесь это важно.

Объявление друга не является выражением.

Когда функция main() преобразуется в указатель, и этот указатель присваивается p, это является выражением, и оно потенциально оценивается (C ++ 03 §3.2 / 2):

Выражение потенциально оценивается , если только оно не появляется там, где требуется целочисленное константное выражение (см. 5.19), является операндом оператора sizeof (5.3.3) или являетсяоперанд оператора typeid и выражение не обозначает lvalue типа полиморфного класса (5.2.8).

1 голос
/ 26 августа 2010

C ++ 03 Приложение C.1 о совместимости C ++ и ISO C гласит:

Изменения в 3.6

Изменение : Main нельзя вызывать рекурсивно и не может иметьвзят его адрес
Обоснование : для основной функции могут потребоваться специальные действия.
Влияние на исходную функцию : Удаление семантически четко определенной функции
Трудностьпреобразования : Тривиально: создайте посредническую функцию, такую ​​как mymain (argc, argv.
Как широко используется : Редко

0 голосов
/ 26 августа 2010

Я думаю, что в первом случае функция друга просто ссылается на «некоторую функцию, называемую основной», а во втором случае это скорее «о, вы имеете в виду ОДНУ основную? Я не могу этого допустить».

0 голосов
/ 26 августа 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...