2017-06-06 322 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很难有更好的回答。