2017-06-06 75 views
-3

OpenGL ES着色器代碼被定義爲C字符串。爲了更直觀地編寫着色器代碼,我定義了一個名爲SHADER_STRING(code)的宏,如下所示。但我遇到GCC警告unknown escape sequence: '\#',不知道如何抑制或修復它。GCC:如何解決或抑制警告:未知的轉義序列:'#'

甲示例代碼如下

#include <stdio.h> 

int main(void) 
{ 
#define _SHADER_STRING(code) #code 
#define SHADER_STRING(code) _SHADER_STRING(code) 
    // OpenGL ES Shader codes 
    char vShaderStr[] = SHADER_STRING(
     \#version 300 es \n 

     void main() 
     { 
      // ... some OpenGL ES codes. 
     }); 
    printf("%s\n", vShaderStr); 
    return 0; 
} 

由於#version是由OpenGL ES的3.0所支持的預處理器,那麼它的無效更換\#\\#,否則代碼將成爲

\#version 300 es 
void main() { } 

OpenGL着色器編譯器會抱怨對\#version一無所知。

+2

簡單地說'#version ...'呢? – xanoetux

+4

你的[mcve]不能編譯,你的問題不清楚。 – Stargateur

+3

什麼是'TS_SHADER_STRING'?代碼片段中只定義了'SHADER_STRING'。 '\#'簡單地變成'#'與提到的警告。爲什麼逃跑呢?我有一種預感,即你從別的地方複製粘貼了這段代碼,並在解析上下文的時候將它取出。 – dhke

回答

4

this answer,下面的代碼應該工作:

#define GLSL(version, shader) "#version " #version "\n" #shader 

const GLchar* vShaderStr_30 = GLSL(300, 
    void main() { 
     … 
    } 
); 
+0

該字符串是OpenGL ES着色器代碼。 '#version'是OpenGL ES 3.0支持的宏,但不是2.0。所以如果使用你的實現,我必須定義兩個版本的'SHADER_STRING'。 –

+0

似乎只有一個分辨率定義了兩個版本的SHADER_STRING,即SHADER_STRING2和SHADER_STRING3。 –

1
#define _SHADER_STRING(str) #str 
#define SHADER_STRING(str) _SHADER_STRING(str) 
// OpenGL ES Shader codes 
char vShaderStr_30[] = SHADER_STRING(#version 300 es \n 

    void main() 
    { 
     // ... 
    }); 

但沒有一個好的Minimal, Complete, and Verifiable example很難有更好的回答。