함수가 외부에서 액세스되고 있음을 분명히하는 방법은 무엇입니까?


9

이것은 C 관련 질문입니다. 번역 단위 경계 안에 가능한 모든 것을 유지하려고 노력하고 .h파일을 통해 몇 가지 기능 만 노출시킵니다 . 즉, static파일 수준 개체에 연결을 제공하고 있습니다.

이제 다른 모듈에서 몇 가지 함수를 호출해야하지만 직접은 아닙니다. 내 모듈 / 파일 / 번역 장치가 다른 모듈을 구독하여 함수에 포인터를 전달합니다. 그런 다음 특정 이벤트가 발생하면 포인터가 일부 인수와 함께 호출됩니다.

그래서 그 기능이 불분명 한 위치에서 호출된다는 것을 분명히하는 방법이 궁금합니다.

  • 그들은 static또는 extern(및에 노출 되어야합니까 .h)?
  • 함수 이름에 힌트를 포함시켜야합니까?
  • 아니면 "X"라고하는 주석을 달기에 충분합니까?

1
훌륭한 질문입니다. 내 솔루션 (내가 너무 행복하지 않기 때문에 주석에 넣는 이유)은 원하는 범위에서 여러 개의 헤더 파일을 현명하게 명명하고 그룹화하는 것입니다. AStar 라이브러리의 경우 AStar.h, AStar_private.h, AStar_packagePrivate.h 등을 만들었습니다.
Shivan Dragon

답변:


2

컴파일 유닛 (파일)의 관점에서, 당신이 관심을 가져야 할 유일한 것은 외부에서 함수를 사용할 수 있는지 여부입니다. 사용 가능하게하는 것은 호출되도록 의도 된 것이므로 이러한 호출이 발생한다는 가정하에 작업해야합니다. 함수 자체에 대한 관심은 시작점에서 시작됩니다. 제어가 처음에 도달하는 방식은 제어를 수행하는 코드에만 중요합니다.

CI의 모든 구현에서 알려진 연결은 상징적이므로 함수를 호출하는 모든 것은 그 상징을 참조해야합니다.

foo();  /* Direct */

some_function_pointer_t funcs[] = { &foo, &bar, &baz };  /* Indirect */

실수로로 선언 foo()하면 static프로그램이 연결되지 않습니다. non-으로 선언하면 static호출되지 않은 노출 함수가 있습니다. 함수 사용 여부에 대한 질문은 오브젝트 파일의 기호 테이블을 덤프하거나 소스에서 검색하여 해결할 수 있습니다.


1

그래서 나는 그 기능들이 불분명 한 위치에서 호출된다는 것을 분명히하는 방법을 방황하고 있습니다.

"불분명"을 정의하십시오.
방법은 잘 정의 된 "인터페이스"를 통해 노출되어야하며 Shivan Dragon에서 이미 제안했듯이 해당 "인터페이스" .h 파일입니다. 다른 프로그램에 "올바른"헤더 파일을 제공하지 않으면 메소드를 호출 할 수 없습니다.

정적이거나 extern이어야합니까 (.h에 노출)?

static 있도록 당신이 모든 클래스를 가지고 있지 않는 한 인스턴스 데이터를 포함하는 [-like 구조]이 확인합니다.
extern의미 실제로 전혀 그것을 구현하지 않는다; 연결 프로세스 동안 다른 곳에서 구현이 "획득"됩니다.

함수 이름에 힌트를 포함시켜야합니까?

아니면 "X"라고하는 주석을 달기에 충분합니까?

절대적으로하지.

아무리 의미가 있더라도 이와 같은 의견은 작성을 마치는 순간 사용되지 않습니다.


첫 번째 요점을 설명하면 함수는 다음과 같이 호출됩니다. 구성 요소에 외부 .h파일이 포함되어 있습니다. 거기에서 함수를 호출하고 모듈 자체 함수 중 하나에 대한 포인터를 제공합니다. 나중에 외부 코드는 해당 포인터에있는 것을 호출합니다. 따라서 내 함수는 내 헤더 파일을 포함하지 않고 누군가를 포함하는 누군가가 호출합니다.
Vorac

1
두 번째 요점과 관련하여, 내가 이해하는 한, 파일 범위에서 정의 된 객체는 기본적으로 외부 연결을 갖습니다. 따라서 extern키워드는 중복 됩니다.
Vorac

0

콜백 함수가 모듈 내에 정의되어 있고 사용자가 자신의 함수 중 하나를 제공하지 않으면 초기화 단계에서 자리 표시자를 사용할 수 있다고 생각합니다. 자리 표시자는 일반적으로 enum내부에서 올바른 static함수로 변환됩니다 .


0

나는 여전히 그것들을 만들고 static(단지 누군가에 의해 연결되고 호출되도록 의도되지는 않았 음), 그들의 목적으로 그들의 이름으로 외부 함수에 제공된 콜백으로 표시합니다.

static 숨길 수있는만큼 숨길 수있는 것을 숨기려고하기 때문입니다.

a), 주석이 만료되어 b) 콜백이 제공되는 위치 에서이 기능이 그런 식으로 사용되도록 의도 된 것이 분명하기 때문에 이름에 표시하십시오. 명명 규칙을 따르지 않는 함수의 주소를 사용하십시오.


0

범위 한정자는 주로 "충분히 근접한"문서 형식이 아닌 컴파일러에 대한 정보로 사용해야합니다. 사용 static하지 당신이 원하는, 그것은 현재의 컴파일러와 함께 작동 할 수에도 불구하고 - 특히 허가의 C 컴파일러는 콜백으로 포함하는 모듈 외부에서 함수를 사용할 수 없게합니다.

물론 코드에 주석을 추가해야합니다. 코드가 혼동 될 수있는 상황임을 알 수 있습니다. 비정상적이거나 예상치 못한 것은 적절한 의견이 필요합니다. 그러나 다른 답변에서 언급했듯이 주석은 읽지 않거나 오래된 것일 수 있습니다.

따라서 남은 유일한 옵션은 함수의 이름을 지정하여 콜백임을 나타냅니다. 대부분의 예는 내가 사용 보았다 _callback또는 _cb접미사로, 또는 cb_접두어로. 코드에서 콜백이 비정상적인 경우 긴 형식을 사용하고 일반적인 경우 짧은 형식을 사용하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.