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
'Program Tip' 카테고리의 다른 글
Pandas 데이터 프레임의 열을 1 위로 이동 하시겠습니까? (0) | 2020.11.17 |
---|---|
8 개의 논리적 참 / 거짓 값을 1 바이트 안에 저장합니까? (0) | 2020.11.17 |
Convert.ToBoolean 및 Boolean.Parse는 0과 1을 허용하지 않습니다. (0) | 2020.11.17 |
django의 auth_user.username이 varchar (75)가 될 수 있습니까? (0) | 2020.11.17 |
Rails 3 : 새 중첩 리소스를 만드는 방법은 무엇입니까? (0) | 2020.11.17 |