Что такое внешняя связь и внутренняя связь?

Это - процедура, которую я выполнил для получения его работа. Существует ошибка в администраторе сети, где она не делает импорта ovpn правильно - с 2010(!)

https://bugs.launchpad.net/ubuntu / + source/network-manager-openvpn / + ошибка/606365

, Пока это не фиксируется, я нашел этот сайт

http://howto.praqma.net/ubuntu/vpn/openvpn-access-server-client-on-ubuntu

ПРОЦЕДУРА

Create a new folder in your home dir - I called mine vpn.config
Copy your downloaded client.ovpn file into the new folder

Open client.opvn in an editor

Open a new file
Cut the lines between  tags in client.ovpn
Paste into new file, save this file as ca.crt
Remove both  tags from client.ovpn

Open a new file
Cut the lines between  tags in client.ovpn
Paste into new file, save this file as client.crt
Remove both  tags from client.ovpn

Open a new file
Cut the lines between  tags in client.ovpn
Paste into new file, save this file as client.key
Remove both  tags from client.ovpn

Open a new file - this is the last one :-)
Cut the lines between  tags in client.ovpn
Paste into new file, save this file as ta.key
Remove both  tags from client.ovpn

And remove this line:
key-direction 1


Now position the cursor in client.ovpn, right above the line # -----BEGIN RSA SIGNATURE-----

Insert the following lines

ca ca.crt
cert client.crt
key client.key
tls-auth ta.key 1

Save and close all the files.

Goto Network Manager -> Edit Connections ->VPN
click Import, browse to the modified client.ovpn in the folder you recently created - and where your certificates are, and import that file
Enter vpn username and password if prompted
On the VPN page, select Advanced
On the General Tab, uncheck the first option, "Use custom gateway"

Save

Use...

317
задан Rakete1111 6 May 2017 в 20:26
поделиться

4 ответа

Когда вы пишете файл реализации ( .cpp , .cxx и т. д.), ваш компилятор генерирует единица перевода . Это объектный файл из вашего файла реализации плюс все заголовки, которые вы #include d в нем.

Внутренняя связь относится ко всему, только в рамках единицы перевода .

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

256
ответ дан 23 November 2019 в 01:02
поделиться

Как сказал чувак, внешняя связь означает, что символ (функция или глобальная переменная) доступен во всей вашей программе, а внутренняя связь означает, что это доступен только в одной единице перевода .

Вы можете явно управлять связыванием символа с помощью ключевых слов extern и static . Если связь не указана, то по умолчанию используется связь extern для символов, отличных от const , и static (внутренняя) для символов const . .

// in namespace or global scope
int i; // extern by default
const int ci; // static by default
extern const int eci; // explicitly extern
static int si; // explicitly static

// the same goes for functions (but there are no const functions)
int foo(); // extern by default
static int bar(); // explicitly static 

Обратите внимание, что вместо использования static для внутренней компоновки лучше использовать анонимные пространства имен , в которые вы также можете поместить class es. Связь анонимных пространств имен изменилась между C ++ 98 и C ++ 11, но главное, что они недоступны для других единиц перевода.

namespace {
   int i; // external linkage but unreachable from other translation units.
   class invisible_to_others { };
}
274
ответ дан 23 November 2019 в 01:02
поделиться
  • Глобальная переменная имеет внешнюю связь по умолчанию . Его область действия может быть расширена на файлы, не содержащие его, путем предоставления соответствующего объявления extern в другом файле.
  • Объем глобальной переменной может быть ограничен файлом, содержащим ее объявление, путем добавления к объявлению ключевого слова static . Считается, что такие переменные имеют внутреннюю связь .

Рассмотрим следующий пример:

1.cpp

void f(int i);
extern const int max = 10;
int n = 0;
int main()
{
    int a;
    //...
    f(a);
    //...
    f(a);
    //...
}
  1. Сигнатура функции f объявляет f как функцию с внешней связью (по умолчанию) . Его определение должно быть предоставлено позже в этом файле или в другой единице перевода (приведенной ниже).
  2. max определяется как целочисленная константа. Связь по умолчанию для констант - внутренняя . Его связь меняется на внешнюю с помощью ключевого слова extern . Итак, теперь к max можно получить доступ в других файлах.
  3. n определяется как целочисленная переменная. Связь по умолчанию для переменных, определенных вне тел функций, - external .

2. cpp

#include <iostream>
using namespace std;

extern const int max;
extern int n;
static float z = 0.0;

void f(int i)
{
    static int nCall = 0;
    int a;
    //...
    nCall++;
    n++;
    //...
    a = max * z;
    //...
    cout << "f() called " << nCall << " times." << endl;
}
  1. max объявлен как имеющий внешнюю связь . Соответствующее определение для max (с внешней связью) должно появиться в каком-то файле. (Как в 1.cpp)
  2. n объявлен как имеющий внешнюю связь .
  3. z определяется как глобальная переменная с внутренней связью .
  4. Определение nCall указывает nCall как переменную, которая сохраняет свое значение при вызовах функции f () .В отличие от локальных переменных с классом автоматического хранения по умолчанию, nCall будет инициализироваться только один раз в начале программы, а не один раз при каждом вызове f () . Спецификатор класса хранения static влияет на время жизни локальной переменной, а не на ее область действия.

NB: Ключевое слово static играет двойную роль. При использовании в определениях глобальных переменных он указывает внутреннюю связь . При использовании в определениях локальных переменных он указывает, что время жизни переменной будет продолжительностью программы, а не продолжительностью функции.

Надеюсь, это поможет!

89
ответ дан 23 November 2019 в 01:02
поделиться

В терминах 'C' (поскольку ключевое слово static имеет разное значение между 'C' и 'C ++')

Давайте поговорим о различных областях видимости в 'C'

ОБЛАСТЬ ПРИМЕНЕНИЯ: Это в основном, как долго я могу что-то видеть и как далеко.

  1. Локальная переменная: область видимости находится только внутри функции. Он находится в области СТЕКА ОЗУ. Это означает, что каждый раз, когда функция вызывается, все переменные которые являются частью этой функции, включая аргументы функции только что созданные и уничтожаются, как только управление выходит из функция. (Поскольку стек сбрасывается каждый раз, когда функция возвращает)

  2. Статическая переменная: Область действия - для файла. Он доступен везде в файле
    в котором это заявлено. Он находится в сегменте DATA оперативной памяти. С доступ к нему возможен только внутри файла и, следовательно, ВНУТРЕННЯЯ связь. Любой
    другие файлы не могут видеть эту переменную. Фактически ключевое слово STATIC - это единственный способ, которым мы можем ввести некоторый уровень данных или функции
    скрывается в 'C'

  3. Глобальная переменная: Область действия распространяется на все приложение. Доступен с любого где приложения. Глобальные переменные также находятся в сегменте DATA. Поскольку к нему можно получить доступ из любого места в приложении и, следовательно, ВНЕШНЯЯ связь

По умолчанию все функции являются глобальными. В случае, если вам нужно скрыть некоторые функции в файле извне, вы можете префикс статического ключевое слово функции. : -)

26
ответ дан 23 November 2019 в 01:02
поделиться
Другие вопросы по тегам:

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