extern inline은 무엇을 합니까?
는 그것을 한다.inline
그 자체는 컴파일러에 대한 제안이며, 그 재량에 따라 함수를 인라인화할 수도 있고 링크 가능한 객체 코드를 생성할 수도 있습니다.
는 ★★★★★★★★★★★★★★★★★★★★★★★★」static inline
는 같은 동작을 합니다(인라인 또는 인라인하지 않을 수 있습니다).다만, 다른 모듈이 링크 할 수 없기 때문에, 인라인의 경우 링크 가능한 오브젝트코드는 생성되지 않습니다.
'어디서양속담,은요?extern inline
떻게해 해???
이를 들어 매크로는 인라인을 합니다).__FILE__
★★★★★★★★★★★★★★★★★」__LINE__
이 기능은 사용할 수 없지만 발신자에 대해서는 해결할 수 있는 매크로입니다).즉, 함수가 inline이 되지 않을 경우에 컴파일러 또는 링커 오류를 보고 싶습니다.extern inline
(매크로를 하는 것 에는 이 을 할 수 (그렇지 않은 경우 매크로를 사용하는 것 외에 이 동작을 실행할 수 있는 방법은 없다고 생각합니다).
C++와 C는 다른가요?
컴파일러 벤더와 버전에 따라 차이가 있습니까?
K&R C89는 K&R C입니다.하고 GCC를 했습니다.inline
,static inline
, , , , 입니다.extern inline
구성: 대부분의 C99 이전 컴파일러는 일반적으로 선두를 따릅니다.
GNU89:
inline
: 함수가 삽입되어 있을 수 있습니다(단, 힌트에 불과합니다).아웃오브라인 버전은 항상 내보내고 외부에서 볼 수 있습니다.따라서 이러한 인라인은 1개의 컴파일 유닛에서만 정의할 수 있으며, 다른 컴파일 유닛은 모두 아웃오브라인 함수로 인식해야 합니다(또는 링크 시 중복 기호가 표시됩니다).extern inline
는 아웃오브라인 버전을 생성하지 않고 콜할 수 있습니다(따라서 다른 컴파일 유닛에서 정의해야 합니다).아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 맞다.컴파일러가 대신 호출할 경우에 대비하여 라인 외 버전은 여기서 제공하는 인라인과 동일한 코드를 가져야 합니다.static inline
는 외부에서 볼 수 있는 오프라인 버전을 생성하지 않지만 파일 정적 버전을 생성할 수 있습니다.발신된 외부 기호나 외부 기호 호출이 없기 때문에 단일 정의 규칙은 적용되지 않습니다.
C99(또는 GNU99) :
inline
inline과 같은 GNU89 "external inline"이 .extern inline
과 같이: 할 수 GNU89와 같은 "inline" : 외부로 보이는 코드가 출력되므로 최대 1개의 변환 유닛에서 이를 사용할 수 있습니다.static inline
inline : GNU89 "static inline" 입니다. 사이의 유일한 입니다.
C++:
어디에서나 인라인인 함수는 어디에서나 같은 정의를 사용하여 인라인이어야 합니다.컴파일러/링커는 심볼의 여러 인스턴스를 분류합니다..static inline
★★★★★★★★★★★★★★★★★」extern inline
단, 많은 컴파일러가 탑재되어 있습니다(일반적으로 gnu89 모델을 따릅니다).
"뭐야?"라고 대답하는 대신 "어떻게 하면 내가 하고 싶은 대로 할 수 있을까?"라고 대답합니다.인라인에는 5종류가 있으며 모두 GNU C89, 표준 C99 및 C++로 제공됩니다.MSVC에는 몇 가지 기능이 있습니다(MSVC 코드는 테스트하지 않았습니다).
주소가 지정되어 있지 않는 한, 항상 인라인입니다.
__attribute__((always_inline))
다음 중 하나의 경우를 사용하여 주소가 수신될 가능성을 처리합니다.
에 특정 이 필요한 이 .alloca
컴파일러는 보통 자신보다 가치가 있는지 더 잘 알고 있습니다.
에는 MSVC가 있습니다.__forceinline
이는 거의 동일하게 나타나지만, 다른 컴파일러가 정상적으로 작동하는 일반적인 상황(최적화가 꺼진 경우 등)에서는 인라인화를 거부하는 것이 분명합니다.
인라인으로 약한 기호를 내보냅니다(C++, "그냥 작동하게"라고도 함).
__attribute__((weak))
void foo(void);
inline void foo(void) { ... }
이렇게 하면 동일한 코드의 복사본이 여러 개 남아 링커가 임의로 하나를 선택합니다.
MSVC는 C모드에서 정확하게 동등하다고는 생각되지 않지만 비슷한 점이 몇 가지 있습니다. __declspec(selectany)
데이터만을 말하는 것 같기 때문에 기능에는 적용되지 않을 수 있습니다.약한 에일리어스에 대한 링커 지원도 있는데 여기서도 가능한가요?
인라인이지만 어떤 기호도 내보내지 않음(외부 참조가 필요 없음)
__attribute__((gnu_inline))
extern inline void foo(void) { ... }
MSVC ms__declspec(dllimport)
실제의 정의와 조합해(매우 이례적), 이것을 실시한다고 생각됩니다.
항상 송신한다(1개의 TU에 대해 앞의 문제를 해결한다)
암시된 버전은 C++에서는 약한 기호를 방출하지만 C에서는 강한 기호를 방출합니다.
void foo(void);
inline void foo(void) { ... }
또는 힌트 없이 실행할 수도 있습니다.이것은 두 언어 모두에서 강한 기호를 나타냅니다.
void foo(void) { ... }
일반적으로 정의를 제공할 때 TU가 어떤 언어인지 알 수 있으며, 많은 인라이닝이 필요하지 않을 수 있습니다.
MSVC ms__declspec(dllexport)
★★★★★★★★★★★★★★★★★★★★★★★★★★★
모든 TU에서 인라인 및 송신
static inline void foo(void) { ... }
「 」를 한 모든 .static
, 하나,a, 가, 추, 추, 능, 합, 합, 합, 합을 수 있습니다.void foo(void)
를 참조해 주세요. 하면 깨끗한 머리글을 프랙티스이 됩니다.#include
인라인 정의와 함께 개별 파일을 입력합니다.다음으로을 사용하는 C스타일의 인라인을 합니다.#define
1개의 전용 TU에서 일부 매크로를 다르게 설정하여 아웃오브라인 정의를 제공합니다.
마세요.extern "C"
C++는 C++로!
또한 다음과 같은 몇 가지 관련 사항이 있습니다.
never inline
__attribute__((noinline))
모든 함수 선언에 적용됩니다.
에는 MSVC가 있습니다.__declspec(noinline)
단, 멤버 기능에 대해서만 동작하는 것으로 기재되어 있습니다.하지만, 인라인을 방해할 수 있는 "보안 속성"에 대해 언급한 적이 있습니다.
가능한 경우 다른 기능을 이 기능에 포함시킵니다.
__attribute__((flatten))
모든 함수 선언에 적용됩니다.
:noinline
컴파일 시 정의를 알 수 없는 함수와 마찬가지로 이 기능보다 강력합니다.
MSVC에 의한 것입니다.단 한 을 본 이 있다.[[msvc::forceinline_calls]]
(문 또는 블록에 포함되지만) 재귀적이지 않습니다.
이 문장으로 __FILE_와 __LINE__을 오해하고 계신 것 같습니다.
이것은, 발신자에 대해서 해결할 필요가 있는__FILE_ 매크로와 __LINE_ 매크로를 사용하기 때문입니다만, 이것은 호출된 함수가 아닙니다.
컴파일에는 몇 가지 단계가 있으며 전처리가 첫 번째 단계입니다.__FILE__ 및 __LINE__은 이 단계에서 대체됩니다.따라서 컴파일러가 인라인 기능을 검토할 수 있을 때는 이미 대체되어 있습니다.
여기서는 인라인 함수가 아닌 매크로를 선택할 수 있습니다.매크로가 인라인 함수를 지배하는 드문 경우입니다.다음을 시도해 보십시오.'MACRO MAGIC' 코드를 작성했는데 작동될 거예요!gcc/g++ Ubuntu 10.04로 테스트 완료.
//(c) 2012 enthusiasticgeek (LOGGING example for StackOverflow)
#ifdef __cplusplus
#include <cstdio>
#include <cstring>
#else
#include <stdio.h>
#include <string.h>
#endif
//=========== MACRO MAGIC BEGINS ============
//Trim full file path
#define __SFILE__ (strrchr(__FILE__,'/') ? strrchr(__FILE__,'/')+1 : __FILE__ )
#define STRINGIFY_N(x) #x
#define TOSTRING_N(x) STRINGIFY_N(x)
#define _LINE (TOSTRING_N(__LINE__))
#define LOG(x, s...) printf("(%s:%s:%s)" x "\n" , __SFILE__, __func__, _LINE, ## s);
//=========== MACRO MAGIC ENDS ============
int main (int argc, char** argv) {
LOG("Greetings StackOverflow! - from enthusiasticgeek\n");
return 0;
}
여러 파일의 경우 각 c/cc/cxx/cpp 파일에 동일한 매크로를 포함하여 별도의 헤더파일로 정의합니다.가능하면 매크로보다 인라인 함수나 (필요에 따라) 구분자를 선호하십시오.
이런 글을 쓰려고 하는 것 같아요.
inline void printLocation()
{
cout <<"You're at " __FILE__ ", line number" __LINE__;
}
{
...
printLocation();
...
printLocation();
...
printLocation();
매번 다른 값을 출력해 주길 바랍니다.Don이 말했듯이, __FILE__와 __LINE__는 프리프로세서에 의해 구현되지만, 인라인은 컴파일러에 의해 구현되기 때문에 그렇지 않습니다.따라서 print Location에 전화를 걸어도 동일한 결과를 얻을 수 있습니다.
이 작업을 수행하려면 print Location을 매크로로 만들어야 합니다.(네, 알아요...)
#define PRINT_LOCATION {cout <<"You're at " __FILE__ ", line number" __LINE__}
...
PRINT_LOCATION;
...
PRINT_LOCATION;
...
inline, static inline 및 extern inline의 상황은 복잡합니다.이는 gcc와 C99가 동작에 대해 약간 다른 의미를 정의하기 때문입니다(또한 C++도 마찬가지일 가능성이 있습니다).C에서 수행하는 작업에 대한 유용한 상세 정보를 여기에서 찾을 수 있습니다.
언급URL : https://stackoverflow.com/questions/216510/what-does-extern-inline-do
'programing' 카테고리의 다른 글
Vue.config를 정의하고 사용할 때 camelCase 속성 이름을 사용할 수 없습니다.키코드 (0) | 2022.07.04 |
---|---|
Vuex 및 Firebase 저장소 상태 오류 (0) | 2022.07.04 |
Java에서 더블로 정밀도 유지 (0) | 2022.07.04 |
@vue/cli(vue-cli) 프로젝트에서 농담 경고를 비활성화하시겠습니까? (0) | 2022.07.04 |
포인터 또는 주소를 인쇄할 올바른 형식 지정자입니까? (0) | 2022.07.04 |