GCC 编译指示区域错误:“#pragma”之前的预期表达式

GCC Pragma region error: expected expression before ‘#pragma’

提问人:somecollagist 提问时间:6/19/2023 最后编辑:somecollagist 更新时间:6/19/2023 访问量:89

问:

我正在尝试使用 and 指令折叠数组中的元素,但每次编译它时我都会得到:#pragma region#pragma endregion

gcc -ffreestanding -fshort-wchar -fno-stack-protector -Wall -Wno-implicit-function-declaration -c main.c -o main.o
main.c:16:13: error: expected expression before ‘#pragma’
   16 |     #pragma region ExclamationMark
      |             ^~~~~~

下面是一个最小的可重现示例:

#define FontHeight 16

typedef struct { unsigned char g[FontHeight]; } Glyph;

#define GLYPH(_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16) (Glyph){{_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16}}
#define EMPTY_GLYPH (Glyph){{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}}

Glyph Font[] = {
    EMPTY_GLYPH,
    EMPTY_GLYPH,
    EMPTY_GLYPH,
    EMPTY_GLYPH,
    // and so on...
    #pragma region ExclamationMark
    GLYPH(
        0b00000000,
        0b00000000,
        0b00000000,
        0b00001000,
        0b00001000,
        0b00001000,
        0b00001000,
        0b00001000,
        0b00001000,
        0b00001000,
        0b00000000,
        0b00001000,
        0b00001000,
        0b00000000,
        0b00000000,
        0b00000000
    ),
    #pragma endregion ExclamationMark
};

GCC v13 支持上述两个指令(我在 Arch Linux 上使用 GCC 13.1.1),但即便如此,GCC 还是给我抛出了一个错误——据我所知,这最多应该是一个警告,我的工具链不会对错误发出任何警告。

我之所以要这样做,是因为我尝试折叠的元素有多行长,它们本身通过使用头文件中的指令进行了简化。源文件的永久链接在这里#define

提前致谢。

GCC 区域 编译指示

评论

2赞 Some programmer dude 6/19/2023
在代码会发生什么?此类错误通常依赖于较早的错误,与报告错误的行无关。#pragma
0赞 yeputons 6/19/2023
在最简单的情况下对我有用。请提供一个最小的可重现示例,我们可以在本地运行,而不仅仅是一个片段。
0赞 somecollagist 6/19/2023
同样,它在一个简单的情况下对我有用,一个区域和结束区域,中间没有任何关系。在编译指示之前,有一系列EMPTY_GLYPH值,它们是 GLYPH 的特例,定义如下:在此之前只是指令。typedef struct { uint8_t g[FontHeight]; } Glyph; #define GLYPH(_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16) (Glyph){{_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16}} #define EMPTY_GLYPH (Glyph){{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}}#include
1赞 Some programmer dude 6/19/2023
另请注意,错误可能存在于头文件中,并在包含这些错误的源文件中报告。你真的应该尝试创建一个最小的可重现的例子。您甚至可能在创建示例时自己找出问题所在。
1赞 yeputons 6/19/2023
在我看来,GCC 13 不再接受 s 内部表达式,例如 的初始化,即使它什么也没做。我没有看到 GCC 12 的问题。也许这是一个必须报告的错误。#pragmaFont[]#pragma region

答: 暂无答案