Program Tip

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

programtip 2020. 11. 17. 21:01
반응형

GNU C 매크로 envSet (name)에서 (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;다음 과 같은 작업을 수행 하면 구문 오류가 발생합니다.


두 개의 연속 된 문자열 리터럴이 연결됩니다. 아마도 그것은 name문자열 리터럴 인지 확인 하고 있습니다. 그렇지 않은 경우 컴파일러는 오류를보고합니다.

(void) cast는 "효과가없는 문"과 같은 경고를 억제합니다.


코드를 보면 getenv처음 호출 때 호출 하고 결과를 캐시 한 다음 getenv더 이상 호출 할 필요없이 캐시 된 결과를 사용하는 것이 목적이라고 생각합니다 . getenv문자열 리터럴과 함께 사용 되면 모든 후속 호출에서 동일한 환경 변수를 요청합니다. 환경 변수를 변경할 수없는 경우 결과적으로 동일한 결과를 반환합니다. 이후에 변경된 문자열에 대한 포인터가 코드에 제공되면 캐시 된 결과가 새 문자열에 맞지 않을 가능성이 높으므로 ""트릭의 목적은 이러한 일이 발생하지 않도록하는 것입니다.

사용될 수있는 모든 문자열 리터럴에는 고유 한 정적 변수가 연결되어야하므로 표시된 코드 조각은 현명하게 함수로 만들 수 없습니다. 반면에, 각 반복에 필요한 코드의 양은 약간 많이 보입니다. 또한 동일한 변수가 코드의 여러 위치에서 테스트되면 각각 고유 한 변수 세트와 환경 검사 코드로 끝날 수 있습니다.

함수가 사용되는 방식에 따라 호출 될 때마다 환경 변수를 테스트해야하는 코드보다 훨씬 빠를 수 있으며 사전 설정없이 루프 내에서 호출되는 함수 내에서 사용할 수 있습니다. "고급 설정"기능이라고하는 클라이언트 코드에서 이름 조회를 수행해야하며 조회가 완료되었는지 확인하기 위해 루프 내에서 확인할 필요가 없습니다.

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

반응형