Если вы можете выполнить скрипты PHP непосредственно в оболочке, например:
$ script.php
, вы можете указать двоичный файл, который будет выполнять скрипт в его первой строке:
#!/usr/bin/php
Эта линия называется shebang . Строка может отличаться в вашей системе, вам нужно знать полный путь к файловой системе двоичного кода PHP CLI, который вы хотите использовать для этого скрипта.
Если вы запустите этот файл в оболочке, указанный двоичный код будет использоваться. То же самое для cron.
Если вы выполняете этот файл через ваш веб-сервер, PHP будет автоматически отключать эту строку.
См. Также: Особенности: Использование PHP из командной строки
Это явно запрещено в стандарте, даже если некоторые версии VisualStudio действительно позволяют его.
Стандарт C++ 7.1.5.3 Разработанных спецификаторов типа, абзац 2
3.4.4 описывает, как поиск имени продолжается для идентификатора в elaborated-type-specifier. Если идентификатор решает к имени класса или перечислимому имени, elaborated-type-specifier вводит его в объявление тем же путем, простой спецификатор типа представляет свое имя типа. Если идентификатор решает к имени определения типа или шаблонному параметру типа, elaborated-type-specifier плохо формируется. [Отметьте: это подразумевает что, в рамках шаблона класса с шаблонным параметром типа T, друг объявления класс T; плохо формируется.]
Я распознаю, что код выше как шаблон изолирует (запретите расширение), класс. Существует другое решение, которое действительно не блокирует расширение, но это отметит unadvertidly, расширяющийся от класса. Как замечено в ADOBE Source Library:
namespace adobe { namespace implementation {
template <class T>
class final
{
protected:
final() {}
};
}}
#define ADOBE_FINAL( X ) private virtual adobe::implementation::final<T>
с использованием:
class Sealed : ADOBE_FINAL( Sealed )
{//...
};
В то время как это позволяет расширение при реальном принуждении его:
class SealBreaker : public Sealed, ADOBE_FINAL( Sealed )
{
public:
SealBreaker() : adobe::implementation::final<Sealed>(), Sealed() {}
};
Это ограничит пользователей в, по ошибке делают это.
Править:
Предстоящий C++ 11 стандартов действительно позволяет Вам оказывать поддержку аргументу типа с немного отличающимся синтаксисом:
template <typename T>
class A {
// friend class T; // still incorrect: elaborate type specifier
friend T; // correct: simple specifier, note lack of "class"
};
Необходимо ли действительно сделать это? Если Вы хотите препятствовать тому, чтобы кто-то произошел из Вашего класса, просто добавьте комментарий и сделайте деструктор невиртуальным.