programing

상수 함수에 대한 포인터의 의미는 무엇입니까?

newstyles 2023. 10. 21. 10:02

상수 함수에 대한 포인터의 의미는 무엇입니까?

포인터는 변이 가능한(비정규) 데이터를 가리킨다고 선언하거나 상수 데이터를 가리킨다고 선언할 수 있습니다.
함수를 가리키도록 포인터를 정의할 수 있습니다.

동료들과 저는 "const"의 사용에 대해 의견을 나누다가 사용에 대한 질문이 나왔습니다.const함수 포인터를 사용합니다.

다음은 몇 가지 질문입니다.

  1. 상수 함수에 대한 포인터 대 비 상수 함수에 대한 포인터의 의미는 무엇입니까?
  2. 함수가 상수가 될 수 있습니까?
  3. 함수가 non-const (mutable)이 될 수 있습니까?
  4. 함수 포인터를 통과하는 데 적합한(안전한) 구문은 무엇입니까?

편집 1: 함수 포인터 구문

typedef void (*Function_Pointer)(void); // Pointer to void function returning void.

void function_a(Function_Pointer p_func); // Example 1.
void function_b(const Function_Pointer p_func); // Example 2.
void function_c(Function_Pointer const p_func); // Example 3.
void function_d(const Function_Pointer const p_func); // Example 4.

위의 선언들은 함수 포인터를 고유 타입에 대한 포인터와 같이 취급하는 예들입니다.

데이터, 변수 또는 메모리 포인터는 위의 조합을 허용합니다.
따라서 질문은 다음과 같습니다. 함수 포인터가 동일한 조합을 가질 수 있는지, 상수 함수에 대한 포인터가 의미하는 바는 무엇인지(예: 예제 2).

C에서는 함수가 존재한다는 것은 없습니다.const그렇지 않으면, 상수 함수에 대한 포인터는 의미가 없습니다(특정 컴파일러와 확인하지는 않았지만 컴파일해서는 안 됩니다).

비록 다르지만 함수에 대한 상수 포인터, 상수를 반환하는 함수에 대한 포인터 등을 가질 수 있습니다.본질적으로 기능 자체를 제외한 모든 것은 일정할 수 있습니다.몇 가지 예를 들어 보겠습니다.

// normal pointer to function
int (*func)(int);

// pointer to const function -- not allowed
int (const *func)(int);

// const pointer to function. Allowed, must be initialized.          
int (*const func)(int) = some_func;

// Bonus: pointer to function returning pointer to const
void const *(*func)(int);

// triple bonus: const pointer to function returning pointer to const.
void const *(*const func)(int) = func.

매개 변수로서 함수에 포인터를 전달하는 것에 관한 한, 그것은 꽤 간단합니다.일반적으로 포인터를 올바른 유형으로 전달하기를 원합니다.그러나 모든 유형의 함수에 대한 포인터를 다른 유형의 함수에 대한 포인터로 변환한 다음 원래 유형으로 다시 변환하고 원래 값을 유지할 수 있습니다.

C 규격(C99, 섹션 6.7.3)에 따라:

정규화된 유형과 연결된 속성은 l 값인 식에만 의미가 있습니다.

스펙이 "적격 유형"이라고 말할 때, 그것은 다음과 같이 정의된 것들을 의미합니다.const,restrict, 아니면volatile키워드.스니스 함수는 l 값이 아닙니다.const함수의 키워드는 의미가 없습니다.컴파일러별 확장자 같은 것을 보고 있을 수도 있습니다.함수를 다음과 같이 선언하려고 하면 일부 컴파일러에서 오류가 발생합니다.const.

함수에 대한 포인터가 아니라 일정한 함수에 대한 포인터를 보고 있습니까?(, 포인터는 다음과 같습니다.)const, 함수가 아님)?

#4 관련: 함수 포인터 생성, 전달 및 사용에 대한 유용한 개요는 이 가이드를 참조하십시오.

C 아래에서는, A와 같은 것은 없습니다.const기능.const는 형식 qualifier이므로 함수가 아닌 형식만 사용할 수 있습니다.함수에 대한 const 포인터 또는 함수에 대한 non-const 포인터를 말하는 것입니까?

는 C++일 수 .const. 메소드가const, 메서드를 호출한 후 메서드를 포함하는 개체가 메서드를 호출하기 전과 동일한 상태가 됨을 의미합니다(인스턴스 변수 [1]의 none가 수정됨).따라서 const 방법과 non-const 방법을 가리킬 수 있으며 이 방법들은 다릅니다.

인수 목록의 함수 포인터를 다음과 같이 사용할 수 있습니다.retType (*variableName)(arguments).

[1] 그들이 아니라면.mutable.

C에서 함수는const만약 당신이 GCC의 세계에 있다면!함수를 선언할 수 있습니다.const함수 및 기타 기호의 선언에 첨부된 속성의 사용을 통해.이것은 기본적으로 컴파일러가 어떤 종류의 최적화를 할 수 있도록 본체를 사용할 수 없음에도 불구하고 함수가 무엇을 하는지에 대한 정보를 컴파일러에게 제공하는 데 사용됩니다.

상수 함수는 일반적으로 다음과 같이 정의됩니다.pure기능.

순기능은 기본적으로 부작용이 없는 기능입니다.즉, 순수 함수는 주어진 매개 변수와 전역 메모리를 기반으로 계산된 값을 반환하지만 다른 전역 변수의 값에는 영향을 미칠 수 없습니다.순수 함수에는 반환 형식이 적절히 부족할 수 없습니다(즉, 공백 반환 형식이 있음).

이제 우리는 상수 함수가 무엇인지 정의할 수 있습니다.

전역 메모리에 접근하지 않고 단지매개 변수만 접근하는 순수 함수를 상수 함수라고 합니다.이는 함수가 글로벌 메모리의 상태와 무관하기 때문에 동일한 매개 변수가 주어졌을 때 항상 동일한 값을 반환하기 때문입니다.따라서 반환 값은 주어진 매개 변수의 값으로부터 직접적이고 배타적으로 도출됩니다.

여기서const함수의 변이성에 대해서는 아무 의미가 없습니다하지만 그것은 글로벌 메모리에 손을 대지 않는 기능입니다.이러한 함수에 일반 포인터를 할당할 수 있습니다.어쨌든 코드 영역은 일반적으로 (자가 수정 코드를 잠시 잊어버리는) RO가 되며 일반 포인터를 통해 수정할 수 없습니다.

여기에서 통찰력 있는 기사 전체를 읽으십시오.

그래서 GCC Constant 함수에 관해서 우리는 함수 변이성이 아닌 최적화에 대해 이야기하고 있습니다.

1. 상수 함수에 대한 포인터 대 비 상수 함수에 대한 포인터의 의미는 무엇입니까?

const와 non-const는 차이가 없습니다. 함수 자체를 수정할 수 없습니다.

참고: C++에서 함수가 클래스의 멤버 함수인 경우, const는 이 함수 내의 객체의 상태를 변경할 수 없음을 의미합니다(멤버 변수에 할당됨, non-constember functions 호출됨).이 경우 const 키워드는 멤버 함수의 시그니처의 일부이므로 포인터 측면에서 차이가 발생합니다.

2. 함수가 상수가 될 수 있습니까?

위를 보세요.

3. 함수가 non-const (mutable)이 될 수 있습니까?

위 참조

4. 함수 포인터를 통과하기 위한 적절한 (안전한) 구문은 무엇입니까?

자유 함수에 대한 모든 포인터는 자유 함수에 대한 다른 포인터에 캐스트할 수 있습니다(즉, 크기는 동일합니다).따라서 (가정적) 함수에 대한 유형을 정의할 수 있습니다.void f();저장할 모든 함수 포인터를 이 유형으로 변환합니다. 일반적인 유형을 통해 함수를 호출하지 마십시오. 원래 포인터 대 함수 유형에 bact를 캐스팅해야 합니다. 그렇지 않으면 정의되지 않은 동작이 발생합니다(그리고 충돌 가능성이 높습니다).

C++의 경우: 멤버 함수에 대한 포인터는 자유 함수에 대한 포인터로 변환 가능하지 않습니다.

1. 구문적으로 함수의 내용을 일정하게 만들기 위해 'const'를 배치할 곳이 없습니다.

상수 여부에 관계없이 'function is not l-value' 오류가 발생하게 됩니다.

typedef void (* FUNC)(void);
FUNC pFunc;
pFunc = 0;     // OK
*pFunc = 0;    // error:  Cannot assign to a function (a function is not an l-value)

typedef void (* const FUNC)(void);
FUNC pFunc;
pFunc = 0;     // error  (const)
*pFunc = 0;    // error:  Cannot assign to a function (a function is not an l-value)

typedef void (const * FUNC)(void);   // error:  <cv-qualifier>  (lol?)

2 & 3. 함수 포인터 - 네..기능적인 내용, 안 보여요.

4. 기능 포인터를 통과하는 것을 더 안전하게 할 방법이 없다고 생각합니다.전 세계의 모든 상수를 사용하여 'SetCallback'을 보호할 수 있는 유일한 것은 'SetCallback'이 매개 변수의 로컬 복사본을 변경할 수 없다는 것입니다.

typedef void (* const FUNC)(void);
void SetCallback(const FUNC const pCallback)
{
  FUNC pTemp = pCallback;   // OK  (even though pTemp is not const!!)
  pCallback = 0;            // error  (const)
}

언급URL : https://stackoverflow.com/questions/10145693/what-is-meaning-of-a-pointer-to-a-constant-function