무엇을 등록합니까 const char * const * name; 의미하고 왜이 변수가 함수 외부에 있습니까? [복제]
void
usage (cpp)
register const char *const *cpp;
{
(void) fprintf (stderr, *cpp++, program_name, cvs_cmd_name);
for (; *cpp; cpp++)
(void) fprintf (stderr, *cpp);
error_exit ();
}
레지스터 변수가 중괄호 안에없는 이유와 fprintf 앞에이 (무효)가 무엇인지 알 수 없습니다. 또한 const char * const * cpp를 등록하십시오. 이전에는 이와 같은 것을 본 적이 없습니다.
답변
register
키워드는 프로세서의 전용 레지스터에 보관하는 그 값을하고자하는 컴파일러에 대한 힌트입니다. 이것은 읽기 및 쓰기 속도를 높일 수 있습니다. 그러나 최신 컴파일러에서는 이러한 종류의 최적화가 불필요 할뿐만 아니라 종종 비생산적입니다.
함수 선언과 블록 사이에있는 이유는 이전 c (C90 이전)에서는 매개 변수 옆에 매개 변수 유형을 선언하지 않고 함수 선언과 블록 사이에 선언하기 때문입니다.
예를 들면 :
int main(argc, argv)
char ** argv;
{
...
}
argc
유형을 명시 적으로 정의하지 않으면 기본적으로 int가 사용되기 때문에 아무것도 하지 않았습니다.
생각보다 자주 보게 될 것입니다. FFMPEG에서 작업 할 때이 문제를 많이 만났습니다.
(무효) 캐스트는 사용되지 않는 매개 변수 경고 / 오류를 방지합니다. 저수준 콜백 함수로 PortAudio에서 작업 할 때이 문제가 발생했습니다.
"이전에 본 적이없는"이유는 원래의 역사적 K & R C 버전 의 구문을 사용하기 때문 입니다. 그것은 당신이보고있는 진짜 오래된 C 코드 일 것입니다. 방금 찾아 봤는데 ANSI C (C90)가 1990 년에 나왔기 때문에이 코드는 적어도 30 년 정도 된 것입니다.
나는 이것이 역사적인 C 코드를 다룰 필요가 있다면 알아야 할 것이라고 생각하지만 그렇지 않으면 단순히 잊어 버릴 수 있습니다.
(void)
캐스트는 오늘 의미 같은 것을 의미한다.