2016-09-15 11 views
1

У меня есть кодовая база на C99, которая отлично компилируется и работает на Linux с GCC и Clang; Однако, на MinGW-w64 (устанавливается через MSYS2), он дает ошибки, как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 

Операционная система используется Windows 7 x64. Компилятор был установлен через MSYS2, установив группу пакетов mingw-w64-x86_64-toolchain. Компиляция была выполнена (или, по крайней мере, пыталась) на оболочке MinGW64, созданной MSYS2 при установке.

ответ

3

Похоже, проблема заключается в использовании far и near как имена параметров - это были ключевые слова, которые исторически имели особое значение на хрустящие старых компиляторов x86 при компиляции кода для сегментированных (16 бит) архитектурах - попробуйте изменить имена эти параметры, например far_val и near_val.

Добавление с помощью OP: Проблема заключалась в том, что включает в себя GLAD loader WinDef.h, который определяет

#define far 

и

#define near 

существенно испортить синтаксис.

+1

Ничего себе, я люблю Microsoft. Любой список дополнительных ключевых слов, которые они добавили в C? И почему он носит DOS-багаж? Win7 даже не запускает DOS-программы –

+0

Я чувствую вашу боль - я пишу кросс-платформенный код C/C++, и всегда создаются сборки Windows, которые вызывают большинство проблем и требуют самого «ошарашения» кода. –

+0

О, и я думаю, что «огромный» может также быть похожим анахроническим ключевым словом, которое вы, возможно, захотите избежать. –