если мы исключим первое объявление
blockquote>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); }
Обратите внимание, что приведенный выше код компилируется и выполняется правильно, но разработан-спецификатор типа в параметре-объявлении-разделе функции
blockquote>f
не первый в глобальном пространстве имен.Я не понимаю, что вы пытаетесь здесь сказать. Поскольку это не первое, имя не объявляется и [basic.scope.pdecl] p7 не применяется.
Я хотел бы увидеть пример, демонстрирующий применение пункта (7.2) выше, где упомянутое объявление будет первым в его пространстве имен.
blockquote>auto addrof(struct S& s) { // First declaration return &s; } int get(struct T&); // First declaration
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
ключевое слово служит точно той же цели.
"static"
ключевое слово в C на самом деле выполняет две функции в зависимости от того, где это используется. Те функции являются видимостью и продолжительностью (это мои условия на основе довольно мало обучения, стандарт, если Вы интересуетесь тем уровнем детализации, использует различные термины, которые я часто нахожу, смущает новых студентов, следовательно мое умалчивание в использовании их).
Я собираю то, что Вы, после первый тип, в основном глобальная переменная, так как я не могу сразу видеть большую часть использования для другого варианта в рекурсии..
Это не может быть сделано с тех пор в Java, все должно принадлежать классу. Обходное решение должно создать класс, содержащий "globals" и также:
Java не имеет глобальных переменных, таким образом, нет прямого эквивалента. Однако существует a static
ключевое слово в Java, который совместно использует состояние поля со всеми экземплярами класса, который является хорошим приближением к тому, что Вы описываете.
Я хочу сделать рекурсию в Java, выполняя ту же функцию, которую делает статическое ключевое слово в C...
Однако, если Вы надеетесь делать рекурсию, действительно ли Вы уверены, что статические переменные - то, в чем Вы нуждаетесь? Любое специальное состояние, необходимое для вызова рекурсивной функции, почти всегда пасуется назад к себе, не сохраняется отдельно.
Понятие помех в Java не придерживается с понятием помех в C. Однако существует статическое ключевое слово в Java также. Но больше как помехи в C++ затем C, с некоторыми различиями.
Вы можете смоделировать статический класс в 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, потому что абстрактный ), поэтому в нем могут быть вызваны только статические методы.