Каков эквивалент C “статическое” ключевое слово в Java?

если мы исключим первое объявление struct S; сверху, код не скомпилируется !!

Ну, это потому, что вам все равно нужно объявить имя перед использованием это.

int S;
void f(struct S&); 
extern struct S s; // If you write this line before then it
                   // will not compile.
                   // The name still needs to be declared
                   // before you use it.
// If you drop the `int S` above, then the following
// will also compile, since S has already been declared
// extern S s2;

int main(){
    f(s);
}

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

Я не понимаю, что вы пытаетесь здесь сказать. Поскольку это не первое, имя не объявляется и [basic.scope.pdecl] p7 не применяется.

Я хотел бы увидеть пример, демонстрирующий применение пункта (7.2) выше, где упомянутое объявление будет первым в его пространстве имен.

auto addrof(struct S& s) { // First declaration
    return &s;
}
int get(struct T&); // First declaration
8
задан John Feminella 8 April 2009 в 04:43
поделиться

5 ответов

C имеет два совершенно различного использования static ключевое слово и C++ добавляют третье использование:

// Use 1: declare a variable or function to be local to a given module
// At global scope:
static int global_var;
static void func();

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

// Use 2: declare a variable inside a function with global scope
void func(void)
{
    static int x;
}

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

// Use 3 (C++ only): declare a global variable with class scope
class Widget
{
public:
    static int var;
};

В этом случае это объявляет переменную Widget::var как глобальная переменная, но ее объем отличается. За пределами функций членства класса это нужно назвать как Widget::var; в функциях членства класса это можно назвать как просто var. Это может также быть сделано protected или private ограничить его объем еще больше.

Теперь, каковы аналоги этих 3 использования в Java?

Случай 1 не имеет никакого прямого аналога; самое близкое объявляет объекты с объемом пакета, который сделан путем исключения a public, protected, или private:

class Widget  // Declare a class with package scope
{
    int x;  // Declare a member variable with package scope
    void func() {}  // Declare a member function with package scope
}

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

Случай 2 также не имеет аналога в Java. Самое близкое, которое можно получить, путем объявления глобальной переменной (то есть, статическая переменная класса, так как Java не имеет истинных глобальных переменных в самом строгом смысле):

class Widget
{
    private static int func_x;
    public static void func()
    {
        // use func_x here in place of 'static int x' in the C example
    }
}

Случай 3 является единственным случаем, который имеет прямой аналог в Java. В этом случае, static ключевое слово служит точно той же цели.

30
ответ дан 5 December 2019 в 04:38
поделиться

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

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

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

Это не может быть сделано с тех пор в Java, все должно принадлежать классу. Обходное решение должно создать класс, содержащий "globals" и также:

  • раздайте тот объект, таким образом, можно сослаться на его участников; или
  • создайте одноэлементный объект, таким образом, можно получить доступ к его участникам.
10
ответ дан 5 December 2019 в 04:38
поделиться

Java не имеет глобальных переменных, таким образом, нет прямого эквивалента. Однако существует a static ключевое слово в Java, который совместно использует состояние поля со всеми экземплярами класса, который является хорошим приближением к тому, что Вы описываете.

Я хочу сделать рекурсию в Java, выполняя ту же функцию, которую делает статическое ключевое слово в C...

Однако, если Вы надеетесь делать рекурсию, действительно ли Вы уверены, что статические переменные - то, в чем Вы нуждаетесь? Любое специальное состояние, необходимое для вызова рекурсивной функции, почти всегда пасуется назад к себе, не сохраняется отдельно.

5
ответ дан 5 December 2019 в 04:38
поделиться

Понятие помех в Java не придерживается с понятием помех в C. Однако существует статическое ключевое слово в Java также. Но больше как помехи в C++ затем C, с некоторыми различиями.

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

Вы можете смоделировать статический класс в java следующим образом:

   /**
     * Utility class: this class contains only static methods and behaves as a static class.
     */

public abstract class Utilities
    {
        // prevent inheritance
        private Utilities()
        {
        }
    // ... all your static methods here
        public static Person convert(string) {...}
    }

Этот класс не может быть унаследован (как final, потому что, хотя у абстрактного есть частный конструктор), его нельзя создать (например, static, потому что абстрактный ), поэтому в нем могут быть вызваны только статические методы.

0
ответ дан 5 December 2019 в 04:38
поделиться
Другие вопросы по тегам:

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