IT이야기

GNU C 매크로 envSet(이름)에서 (void) " 이름은 무엇을 의미합니까?

cyworld 2022. 6. 15. 20:57
반응형

GNU C 매크로 envSet(이름)에서 (void) " 이름은 무엇을 의미합니까?

오늘 우연히 이 구문을 발견했는데 무슨 뜻인지 알 수 없었습니다.

// Uses the GNU C statement expression extension
#define envSet(name) ({ \
static int initialised; \
static bool set; \
(void) "" name; \
if (!initialised || !g_cacheEnv) { \
    const char *value = getenv(name); \
    set = value != NULL; \
    initialised = true; \
} \
set; \
})

제가 이해할 수 없는 구체적인 행은 다음과 같습니다.

(void) "" name; \

누가 이것 좀 밝혀줄래요?

이 방법은 스태틱하게 확실하게 하기 위한 방법인 것 같습니다.name는 문자열 리터럴이며 다른 유형이 아닙니다.

네가 한다면.(void)"" "hello";유효한 C 표현입니다.

하지만 만약 당신이 이런 일을 한다면(void)"" 1;구문 오류가 나타납니다.

연속되는 2개의 문자열 리터럴이 연결되어 있습니다.아마도 그것은 그 사람이 어떤 사람인지 확인하고 있을 것이다.name는 문자열 리터럴입니다.그렇지 않으면 컴파일러가 오류를 보고합니다.

(void)캐스트는 "효과 없는 진술"과 같은 경고를 억제합니다.

코드를 보니, 그 목적이 전화를 걸게 하는 것 같아요.getenv첫 번째 호출 시 결과를 캐시하고 그 후 호출하지 않고 캐시된 결과를 사용합니다.getenv더이상.한다면getenv는 문자열 리터럴과 함께 사용됩니다.그 후 모든 콜은 같은 환경변수를 요구합니다.아무것도 환경변수를 변경할 수 없는 경우에는 결과적으로 같은 결과를 반환합니다.그 후에 변경된 문자열에 대한 포인터가 코드에 주어졌을 경우 캐시된 결과는 새로운 문자열에 대해 정확하지 않을 가능성이 높기 때문에 "" 트릭의 목적은 이러한 일이 발생하지 않도록 하는 것입니다.

사용할 수 있는 모든 문자열 리터럴에는 자체 정적 변수가 관련되어 있어야 하므로 지정된 코드 스니펫을 함수로 만들 수 없습니다.한편, 각 반복에 필요한 코드의 양은 조금 많은 것 같습니다.또한 동일한 변수를 코드의 여러 위치에서 테스트하는 경우, 각 변수는 자체 변수 집합과 환경 확인 코드를 가질 수 있습니다.

함수의 사용 방법에 따라서는 호출할 때마다 환경변수를 테스트해야 하는 코드보다 훨씬 빠를 수 있으며, 사전에 셋업하지 않고 루프 내에서 호출되는 함수 내에서 사용할 수 있을 수 있습니다(클라이언트 코드가 「어드밴스 셋업」함수라고 불리는 경우, 이름 조회가 거기서 행해져야 합니다).루프 내에서 조회가 완료되었는지 확인할 필요가 있습니다).

언급URL : https://stackoverflow.com/questions/39792581/in-a-gnu-c-macro-envsetname-what-does-void-name-mean

반응형