const가 C가 아닌데 C ++에서 내부 연결을 의미하는 이유는 무엇입니까?
주제를 참조하십시오. 그들은 무엇을 생각하고 있었습니까?
업데이트 : 혼란을 피하기 위해 "정적"에서 "내부 연결"로 변경되었습니다.
예를 들면 ... 파일에 다음을 넣습니다.
const int var_a = 1;
int var_b = 1;
... g++ -c test.cpp
내보내기 만 사용 하여 컴파일 var_b
합니다.
나는 당신이 의미한다고 믿습니다
const가 C ++에서 내부 연결을 의미하는 이유
네임 스페이스 범위에서 const 개체를 선언하면 내부 연결이있는 것은 사실입니다.
부록 C ( C ++ 11, C.1.2 )는 근거를 제공합니다.
변경 : 명시 적으로 선언 된 const이고 명시 적으로 선언 된 extern이 아닌 파일 범위의 이름은 내부 연결이있는 반면 C에서는 외부 연결이 있습니다.
이유 : const 객체는 C ++에서 컴파일 시간 값으로 사용될 수 있기 때문에이 기능은 프로그래머가 각 const에 대한 명시 적 초기화 값을 제공하도록 촉구합니다. 이 기능을 사용하면 많은 컴파일 단위에 포함 된 헤더 파일에 const 객체를 넣을 수 있습니다.
litb가 말했듯이 const 객체에는 내부 연결이 있습니다. 다음과 같이 사용하기위한 것입니다.
// a.cpp
const int BUFSIZE = 100;
char abuf[BUFSIZE];
// b.cpp
const int BUFSIZE = 256
int bbuf[BUFSIZE];
C & C ++에서 정적이라는 용어는 여러 의미를 갖습니다 (연결 및 저장을 제어 할 수 있음) Stroustrup의 D & E를 읽어 그의 이론적 근거를 이해해야하지만 네임 스페이스 범위에서 변수를 const로 선언하면 자동으로 내부 연결이 있습니다. C에서는 내부 연결을 갖도록 정적으로 선언해야합니다.
물론 C ++에서는 연결을 제어하기위한 정적 사용이 더 이상 사용되지 않으며 익명 네임 스페이스를 사용하여 C ++에서 내부 연결을 시뮬레이션 할 수 있습니다.
C ++의 const 변수는 전 처리기 상수를 대체해야했습니다. 전 처리기 상수는이를 정의하는 파일에서만 볼 수 있기 때문에 마찬가지로 const는 자동으로 변수를 정의하는 파일에서만 볼 수 있도록합니다.
Const와 static은 C와 C ++ 모두에서 직교 개념입니다.
const
키워드는 식의 좌변으로 나타나는 변수를 허용하지 않도록 컴파일러를 알려줍니다 - 기본적으로는 읽기 전용으로 만들기.
C에서 static
키워드는 적용 대상에 따라 여러 용도로 사용됩니다. 함수의 변수에 적용되면 변수가 함수의 로컬 범위에 저장되지 않지만 호출시 액세스 할 수 있음을 나타냅니다. 전역 변수 또는 함수에 적용하면 특정 파일에만 액세스 할 수 있습니다. 즉, 선언되지 않은 경우 컴파일 단위 내에서만 액세스 할 수 있습니다 extern
.
C ++에서 static
키워드는 클래스 정의 내에서 사용 되어 각 인스턴스에 대해 로컬이 아닌 클래스의 모든 인스턴스에서 공유 되는 변수를 만들 수 있습니다 . 또한 C ++의 정적 클래스 함수는 해당 클래스 (또는 액세스 권한이있는 클래스)의 정적 변수에만 액세스 할 수 있습니다. 이제 C ++ const
에서는 명시 적으로 선언되지 않는 한 멤버에게 컴파일 단위에 대한 내부 연결을 제공 extern
합니다. 이것이 참조하는 것일 수 있습니다. 이를 통해 헤더 파일을 사용하여 컴파일 타임 상수를 유닛간에 공유 할 수 있습니다. 그러나 멤버는 실제로 정적이 아니라 상수 가 참조 되는 각 위치로 컴파일됩니다 .
이러한 개념은 직교 하며 같은 것으로 생각해서는 안됩니다.
Constness는 액세스 타당성입니다. 변수가 읽기 전용 (const)인지 쓰기-읽기 (비상 수)인지 여부 만 알려줍니다.
정적은 수명 (기술적으로 메모리 지역화) 속성입니다. 변수가 클래스 범위 (클래스에있을 때) 또는 변환 단위 (cpp에 정의 된 전역 변수와 함께 사용되는 경우)에서 전역이 될지 여부를 알려줍니다. .
그렇지 않으며 가장 명백한 예는 const 멤버 변수 (물론 생성자에 의해 초기화 됨)가있는 경우 해당 클래스의 모든 개체가 공유하지 않고 각각에 대해 개별적이라는 것입니다.
class A {
public:
A(int newx) : x(newx);
private
int x;
}
litb는 위의 최상의 답변을 제공합니다.
그렇지 않습니다. 다음을 작성하십시오.
const int i = 0;
i
정적으로 만들지 않습니다 (C 또는 C ++에서).
'development' 카테고리의 다른 글
$ exceptionHandler 구현을 재정의하는 방법 (0) | 2020.10.25 |
---|---|
.NET에서 오류 및 경고 메시지 상자를 표시하는 방법 / MessageBox를 사용자 지정하는 방법 (0) | 2020.10.25 |
Java 오류 : 유형 만 가져올 수 있습니다. (0) | 2020.10.24 |
constructor-extension-method를 만들 수 있습니까? (0) | 2020.10.24 |
JSLint 오류 : "함수를 포함하는 괄호로 호출 이동" (0) | 2020.10.24 |