programing

C에서 "개인/제한된" 기능을 구현하는 방법은 무엇입니까?

css3 2023. 8. 13. 09:54

C에서 "개인/제한된" 기능을 구현하는 방법은 무엇입니까?

저는 C 인터뷰에서 매우 흥미로운 질문을 받았습니다.특정 g() 함수에서만 호출할 수 있는 방식으로 함수 f()를 구현하려면 어떻게 해야 합니까?g() 이외의 함수가 f()를 호출하려고 하면 컴파일러 오류가 발생합니다.

처음에는 함수 포인터로 이것을 수행할 수 있고 런타임에 통화를 차단할 수 있다고 생각했습니다.하지만 저는 컴파일 타임 전략을 생각할 수 없었습니다.저는 이것이 ansi C를 사용하여 가능한지 조차 모릅니다.

아무도 몰라요?

한 가지 방법이 있습니다.

int f_real_name(void)
{
    ...
}

#define f f_real_name
int g(void)
{
    // call f()
}
#undef f

// calling f() now won't work

다른 방법으로, 만약 당신이 그것을 보장할 수 있다면.f()그리고.g()으로, " 의유기다같습다니음과은능파일일"를 입니다.f()~하듯이static.

편집: 컴파일러 오류를 발생시키는 또 다른 매크로 트릭:

static int f(void) // static works for other files
{
    ...
}

int g(void)
{
    // call f()
}
#define f call function

// f() certainly produces compiler errors here

g()와 f()를 같은 모듈에 넣고 f()를 static으로 선언합니다.static 키워드를 사용하면 f()를 동일한 모듈 또는 원본 파일의 함수에서만 사용할 수 있습니다.

또한 모듈에 f()와 g()가 있는 다른 메서드를 사용할 수 없으며, 그렇지 않으면 f()를 호출할 수도 있습니다.

PS - 저는 Chris Lutz의 답변이 사실 최고라고 생각합니다.이 접근 방식뿐만 아니라 환경 조건이 더 적은 교묘한 매크로 이름 변경도 언급합니다(이 두 기능에 대해 특별히 모듈 파일이 필요하지 않음).

또한 매크로를 사용하면 다음 작업을 수행할 수 있습니다.

#define f() f_should_not_be_called_by_anything_except_g

그러면 오류 메시지가 표시되고 사용자가 f()를 입력할 때 자동 완성기(Visual Studio 등)에 해당 팁이 표시됩니다.

는 module-private 함수로 수 .static키워드:

static void func(void)
{
    // ...
}

그리고나서,func()동일한 파일에 정의된 다른 함수들에 의해서만 호출될 수 있습니다(기본적으로, 동일한 번역 단위: 정의가 포함된 다른 함수들).#include디렉티브는 여전히 액세스할 수 있습니다.)func내부 연결이 있다고 합니다.다른 모든 기능(즉, 다음 기능 제외)static키워드)는 외부 연결을 가지고 있다고 합니다.

그 이상으로, 아니요, 기능에 접근할 수 없게 만드는 방법은 없습니다.매크로를 사용하여 함수의 이름을 변경할 수 있지만 다른 코드는 항상 적절한 이름으로 액세스할 수 있습니다.

f()그리고.g()동일한 소스 파일에서 선언합니다.f()정적의

GCC의 옵션은 중첩 함수를 사용하는 것입니다.표준 C는 아니지만 꽤 잘 작동합니다.

그것은 우연의 일치로 가능합니다.

함수 f()와 g()가 모두 동일한 원본 파일에 있고 파일에 다른 함수가 없으며 g()가 f()에 대한 함수 포인터를 호출자에게 반환하지 않는 경우 f()를 정적으로 만들면 작업이 수행됩니다.

다른 함수가 동일한 원본 파일에 나타나야 하는 경우, f()를 파일 하단에 정적 함수로 배치하고 g() 직후에만 정의하면 거의 동일한 효과를 얻을 수 있습니다. 컴파일러에게 '선언 누락'에 대한 오류를 생성하도록 지시하지 않으면 다른 함수가 경고와 함께 호출할 수 있습니다.

#include <stdio.h>

extern void g(void);    /* in a header */

/* Other functions that may not call f() go here */

static void f(void)
{
    puts("X");
}

void g(void)
{
    f();
}

분명히, 이 기술은 x()와 y()라는 동일한 파일의 다른 함수 쌍으로 안정적으로 확장될 수 없으므로 x()와 x()만 y()를 호출할 수 있고 g()와 g()만 f()를 동시에 호출할 수 있습니다.

그러나 일반적으로 당신은 프로그래머의 규율에 의존하고 소스 파일에서 단순히 f()를 g()만이 부를 수 있는 주석과 함께 정적으로 만든 다음 g() 이외의 함수가 f()를 호출하도록 코드를 수정하는 사람을 징계합니다.

f()를 매크로로 구현하고 사전 컴파일러가 처리하도록 할 수 있습니다.

#include <stdio.h>

#define f(s) printf("Hello %s!\n", s);

void g(char * w) {
        f(w);
}
#undef f

int main(void) {
        /* f() calls will produce an undefined reference to 'f' linker error */
        g("World");
        return(0);
}

이러한 방식으로 다른 노출된 기능이 없으며 정적 기능이 필요하지 않습니다.

언급URL : https://stackoverflow.com/questions/1401781/how-to-implement-a-private-restricted-function-in-c