헤더 파일의 정적 인라인 함수
최근에 오픈소스 C 코드를 좀 더 읽어보려고 시도하고 있습니다.제가 취미 프로젝트에서 채택하고 있는 일반적인 패턴은 다음과 같습니다.
제 C 파일에는 정적이거나 내보내는 기능이 있습니다.내보낸 함수만 헤더 파일에 저장됩니다.개체 범위 내에서만 사용되는 전역 변수도 정적 전역 변수로 사용됩니다.
나의 질문은 의 유용성과 동기에 관한 것입니다.static inline헤더 파일 내부의 기능.내가 온라인에서 읽은 바로는, 사용하지 않는 것으로.static키워드는 다중 정의 오류를 야기하며 그것이 함수를 단지 정의하지 않는 이유입니다.inline.
그러나 이 기능은 다른 개체가 사용할 수 있도록 내보냄을 의미합니까?만약 그렇다면 그냥 이 함수를 C 파일에 정의하고 헤더 파일을 통해 내보내는 것은 어떨까요?만약 그렇지 않다면, 왜 이것을 C 파일 안에 그냥 두지 않고 헤더 파일에 넣습니까?
이런 코딩 스타일 뒤에 이유가 있나요?제가 무엇을 빠뜨리고 있나요?
하나의 그러한 예는 내부의 깃 코드 베이스에서 찾을 수 있습니다.hashmap.h:
/*
* Converts a cryptographic hash (e.g. SHA-1) into an int-sized hash code
* for use in hash tables. Cryptographic hashes are supposed to have
* uniform distribution, so in contrast to `memhash()`, this just copies
* the first `sizeof(int)` bytes without shuffling any bits. Note that
* the results will be different on big-endian and little-endian
* platforms, so they should not be stored or transferred over the net.
*/
static inline unsigned int sha1hash(const unsigned char *sha1)
{
/*
* Equivalent to 'return *(unsigned int *)sha1;', but safe on
* platforms that don't support unaligned reads.
*/
unsigned int hash;
memcpy(&hash, sha1, sizeof(hash));
return hash;
}
A static inline함수는 실제로 어떤 좋은 최적화 컴파일러에 의해 (예를 들어 그것이 주어졌을 때 GCC에 의해) 인라인될 가능성이 있습니다.-O2대부분의 통화 사이트에서 말입니다.
대부분의 호출 사이트(아마도 모든 호출 사이트)에서 인라인 처리될 수 있기 때문에 헤더 파일에 정의됩니다.만약 그것이 방금 선언(그리고 단순히 "내보내기")되었다면 인라인이 발생하지 않을 것입니다(링크-타임 최적화, 예를 들어 LTO, 예를 들어 LTO를 컴파일하고 링크하는 경우 제외).gcc -flto -O2, 이를 통해 구축 시간이 크게 늘어납니다.
실제로 컴파일러는 함수의 본문을 알아야 줄을 설 수 있습니다.따라서 적합한 위치는 어떤 공통 헤더 파일에 정의하는 것입니다(그렇지 않으면 LTO를 활성화하지 않는 한 동일한 변환 단위에서만 인라인화될 수 있습니다). 그러면 모든 변환 단위가 해당 인라인 함수의 본문을 알 수 있습니다.
선언합니다.static컴파일러가 인라인하지 않은 경우(예: 주소를 사용할 때) 다중 정의(링크 시간)를 방지합니다.
하지 않는 경우를 에 C99 C11 (LTO 를) 에는 넣곤 static inline공통 헤더 파일의 정의입니다.
C 전처리기가 언제 어떻게 작동하는지 반드시 숙지해야 합니다.당신이 원칙적으로 (그러나 그것은 매우 나쁜 관행이고 역겨운 스타일일 것이다) 일부를 정의하는 것을 피할 수 있다는 것에 주목하십시오.static inline..c파일. (그러나 생성된 파일은 의미가 있을 수 있습니다. .c파일, 예를 들어 C 코드를 방출하는 컴파일러를 설계하는 경우).
FYILTO는 객체 파일 내부에 일부 내부 컴파일러 표현(일부 GIMPLE)을 내장하고 "링크" 시간에 프론트엔드를 사용하여 일부 "컴파일" 단계를 다시 수행함으로써 최근 GCC 컴파일러에 의해 실질적으로 구현됩니다.실제로 전체 프로그램은 거의 "두 번" 컴파일됩니다.
왜 C가 그 항상 (을 들어 C ).inline함수가 정적임)
언급URL : https://stackoverflow.com/questions/47819719/static-inline-functions-in-a-header-file
'programing' 카테고리의 다른 글
| phphmyadmin을 사용하여 캐스케이드 삭제 및 업데이트 제한에 추가하는 방법은? (0) | 2023.10.11 |
|---|---|
| 사용자에게 UIView가 보이는지 확인합니다. (0) | 2023.10.11 |
| MYSQL로 연결된 동적 PHP 사이트를 CMS로 변환하는 쉬운 방법? (0) | 2023.10.11 |
| CSS 애니메이션 종료 시 최종 상태 유지 (0) | 2023.10.11 |
| WordPress get_posts를 제목별로 예를 들어 다음과 같이 입력합니다. (0) | 2023.10.11 |