Почему порядок, в котором определяются функции-члены структуры C , не имеет значения?

#c #struct #member-functions

#c #struct #функции-члены

Вопрос:

Я изучаю структуры на C и заметил кое-что особенное:

Порядок, в котором определяются функции-члены структуры, не имеет значения, когда дело доходит до вызова функций.

Например,

 #include<bits/stdc  .h>
using namespace std;
struct var
{
    int returnTwo()
    {
        return 2*returnOne();
    }
    int returnOne()
    {
        return 1;
    }
};

int main()
{
    var a;
    cout<<a.returnTwo();
    return 0;
}
  

Приведенный выше код компилируется и выводит 2!

Если бы функции были определены нормально (не внутри каких-либо структур), то приведенный выше код не был бы выполнен.

Почему существует эта разница? Есть ли какие-то конкретные причины?

Спасибо.

Комментарии:

1. Порядок определения функций не имеет значения, если компилятор имеет видимость объявления каждой функции в операторе, который ее вызывает, или перед ним. Компилятор имеет видимость полного struct / class определения, поэтому имеет видимость всех функций, объявленных в нем. Таким образом, функции-члены a struct / class могут обращаться ко всем членам этого struct / class , даже если члены объявлены позже в определении struct / class . И независимо от того, определены ли функции в строке или после определения struct / class .

2. «функции были определены нормально». Встроенное определение тоже нормально! Для этого есть некоторые плюсы и минусы, например, решение циклических проблем по сравнению с лучшей оптимизацией и некоторые другие. Порядок не имеет значения, поскольку доступ осуществляется через имена (символы), а не n-й номер функции. Даже если он переходит к числам, чисто гипотетическим, объявление также должно быть видимым. Поскольку ваше наблюдение частично неверно, особых причин нет, поскольку все компилируется и работает должным образом, если вы включаете определение класса, которое содержит объявления функций-членов, в свой модуль перевода. (main.cpp )

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