2010-07-24 1 views
5

나는 C로 작성된 파일 몇 개를 가지고 있으며, 나는 이들 파일을 C++ 호환으로하고 싶다. C++ : extern 및 인라인 함수

#ifdef __cplusplus 
extern "C" { 
#endif 
파일의 시작 부분에

과 마지막 과정

#ifdef __cplusplus 
} 
#endif 

...의

. 하지만 '인라인'키워드에 문제가있는 것 같습니다. 내 솔루션은 단순히 C++에 대한 인라인 키워드를 제거하는 것이지만 C++ 프로그램에 나쁜 영향을 미칠 수 있다고 생각합니다. 이러한 함수는 시간의 gazillions라고합니다.

더 좋은 솔루션이 있습니까?

답변

2

, 내가 할 것 :


#ifdef __cplusplus 
#define D_INLINE static 
extern "C" { 
#else 
#define D_INLINE inline 
#endif 

그리고 인라인이 필요한 기능에 D_INLINE을 사용하십시오. Delnan이 말했듯이 컴파일러는 어쨌든 최적화 할 것이고 인라인 키워드는 컴파일러가 컴파일러가 함수를 인라인해야한다고 프로그래머가 생각하는 힌트 일뿐입니다. 컴파일러가 함수를 인라인하게하지는 않습니다.

+4

여러 곳에서 여러 개의 정의 오류를 얻을 것입니다. 게다가 논리는 역방향입니다 :'inline' 키워드를 지원하는 C++과 그렇지 않은 C89/C90입니다. –

+0

잘 작동하는 것 같습니다. 어쨌든, 공정하게, 관심있는 모든 C 및 C++ 컴파일러는 '인라인'키워드를 지원합니다. 문제는 C++에서 "extern"을 추가해야하고 인라인 키워드와 충돌이 발생한다고 생각합니다. – Suugaku

+0

표준 C++ 03에서,'inline' 함수는 자동적으로'extern'입니다. 'extern'없이 작동합니까? –

-2

인라인 함수는 다중 이렇게 정의 될 것으로 예상됩니다

#ifdef __cplusplus 
extern "C" { 
#elif __STDC_VERSION__ >= 199901L 
    /* do nothing, C99 supports inline */ 
#else 
# define inline static 
#endif 

많은 C 컴파일러는 인라인 등의 기능을 표시하는 비표준 확장을 가지고, 당신은 또한 (__GNUC__가 정의 된 경우)

__attribute__((always_inline))로 정의 할 수

편집 : 더 더 완벽한 조언을 참조 : 만약 내가 제대로 이해하고 http://www.greenend.org.uk/rjk/2003/03/inline.html

+2

첫째, OP는 C 모드가 아니라 C++ 모드의 문제에 대해 이야기하고있었습니다. 둘째, C++의 인라인 함수에는 "정적"(내부?) 연결이 아닌 * 외부 * 연결이 있습니다. – AnT

+0

연결에 대한 잘못된 정보가 수정되었습니다. 그러나 C++ 인라인 함수는 헤더 파일에 선언되어 있으므로'inline'을'static'으로 대체하는 것은 실제로 잘 작동합니다. –

+1

또한 OP에서는 키워드'inline'을 제거 할 수 없으며 C++뿐만 아니라 모든 모드에서 여러 정의 오류가 발생합니다. –