2016-09-15 5 views
1

GCC와 Clang 모두에서 Linux에서 완벽하게 컴파일되고 실행되는 C99의 코드베이스가 있습니다. 그러나, (MSYS2 통해 설치)는 MinGW-W64에, 그것은C99 코드가 Linux에서 컴파일되고, Windows에서 구문 오류가 발생합니다.

include/math3d.h: In function 'matPerspective': 
include/math3d.h:577:1: error: parameter name omitted 
matPerspective (float y_fov, float aspect, float near, float far) 
^~~~~~~~~~~~~~ 
include/math3d.h:577:1: error: parameter name omitted 
include/math3d.h:595:28: error: expected expression before ')' token 
    m.elem[10] = -((far + near)/(far - near)); 
         ^
include/math3d.h:600:34: error: expected expression before ')' token 
    m.elem[14] = -((2.0 * far * near)/(far - near)); 

분명하게 알 수 있듯이 같은 오류를 제공, 심지어 자체에 대한 모든 토하고없이 헤더 파일을 구문 분석 할 수 없습니다. 오류가있는 프로그램 부분은 다음과 같습니다.

static inline Matrix 
matPerspective (float y_fov, float aspect, float near, float far) 
{ 
    float a = 1.0/tan(y_fov/2.0); 

    Matrix m; 

    m.elem[0] = a/aspect; 
    m.elem[1] = 0.0; 
    m.elem[2] = 0.0; 
    m.elem[3] = 0.0; 

    m.elem[4] = 0.0; 
    m.elem[5] = a; 
    m.elem[6] = 0.0; 
    m.elem[7] = 0.0; 

    m.elem[8] = 0.0; 
    m.elem[9] = 0.0; 
    m.elem[10] = -((far + near)/(far - near)); 
    m.elem[11] = -1.0; 

    m.elem[12] = 0.0; 
    m.elem[13] = 0.0; 
    m.elem[14] = -((2.0 * far * near)/(far - near)); 
    m.elem[15] = 0.0; 

    return m; 
} 

이 코드를 Linux에서 한 달 이상 사용하고 있으며 모든 것이 완벽하게 작동합니다.

컴파일하는 데 사용되는 명령

이었다 : 중고

gcc -c -o obj/win/x86_64/code.o src/code.c -Iinclude -std=c99 

운영 체제는 윈도우 64 (7)이다. 컴파일러는 mingw-w64-x86_64-toolchain 패키지 그룹을 설치하여 MSYS2를 통해 설치되었습니다. 컴파일은 설치시 MSYS2가 생성 한 MinGW64 셸에서 수행되었습니다 (또는 가장 많이 시도되었습니다).

답변

3

farnear을 매개 변수 이름으로 사용하는 것처럼 보입니다.이 키워드는 세그먼트 화 된 (16 비트) 아키텍처 용 코드를 컴파일 할 때 이전에는 구식 오래된 x86 컴파일러에서 특별한 의미가 있었던 키워드였습니다. 이 매개 변수들, 예를 들면 far_valnear_val. OP 의해

추 문제는 본질적 GLAD loader 구문을 어지럽히

#define far 

#define near 

정의 WinDef.h을 포함 하였다.

+1

와우, 나는 마이크로 소프트를 좋아한다. C에 추가 된 추가 키워드 목록은 무엇입니까? 그리고 왜 도스 가방을 들고 다니는거야? Win7은 DOS 프로그램도 실행하지 않습니다. –

+0

저는 크로스 플랫폼 C/C++ 코드를 작성합니다. 항상 Windows에서 가장 많은 문제를 일으키고 코드를 가장 많이 사용하지 않아야합니다. –

+0

오, 나는'거대한'이 당신이 피하고 싶을 수도있는 비슷한 시대 착오적 인 키워드일지도 모른다고 생각합니다. –