최근 내 프로젝트에서 문제가 발생했습니다. 필자는 보통 gcc-4에서 컴파일하지만 gcc-3에서 컴파일을 시도한 후에 인라인 함수의 다른 처리를 발견했습니다. 이를 설명하기 위해 나는 간단한 예제를 만들었습니다gcc - 2 버전, 인라인 함수의 다른 처리
을 main.c :
#include "header.h"
#include <stdio.h>
int main()
{
printf("f() %i\n", f());
return 0;
}
file.c 이것은
#include "header.h"
int some_function()
{
return f();
}
header.h가 나는 컴파일
inline int f()
{
return 2;
}
gcc-3.4.6의 코드는 다음과 같습니다.
gcc main.c file.c -std=c99 -O2
-O2
플래그를 제거하면 링커 오류 (f의 다중 정의)가 발생합니다. 나는 컴파일러가 원하지 않는다면 컴파일러가 인라인 할 필요가 없다는 것을 안다. 그래서 나는 main.c
과 file.c
의 경우 다중 인라인 정의 오류가 발생했을 때 인라이닝 대신 객체 파일에 f를 배치했다고 가정했다. 분명히 f
을 정적으로 만든 다음 최악의 경우에는 이진 파일에 f
을 넣음으로써이 문제를 해결할 수 있습니다.
하지만 함께 GCC-4.3.5이 코드를 컴파일 시도 : 바이너리에 어떤 기능 f
을
gcc main.c file.c -std=c99 -O2
그리고 모든 것이 잘 작동, 그래서 나는 새로운 GCC는 두 경우 모두 f
을 인라인 가정하고 있었다 전혀 (gdb에서 확인하고 나는 옳았다).
그러나 -O2
플래그를 제거하면 int f()
에 대한 정의되지 않은 참조가 2 개 있습니다. 그리고 여기서, 나는 정말로 무슨 일이 일어나고 있는지 이해하지 못합니다. gcc가 f
이 인라인 될 것으로 가정 했으므로 오브젝트 파일에 추가하지 않았지만 나중에 (-O2
이 없었기 때문에) 인라인 대신 이러한 함수에 대한 호출을 생성하기로 결정했기 때문에 링커 오류가 발생했습니다 .
이제 컴파일러에서 문제없이 두려워하지 않고 프로젝트 전체에서 사용할 수 있도록 인라인으로 원하는 단순하고 작은 함수를 어떻게 정의하고 선언해야합니까? 그리고 그들 모두를 정적으로 만드는 것이 옳은 일입니까? 또는 gcc-4가 손상되어 정적이 아닌 한 몇 가지 번역 단위로 인라인 함수를 여러 번 정의해서는 안됩니다.
감사합니다. –