c-如何告诉gcc保留我未使用的标签



编辑:感谢@NateEldredge,我在如何';标签';C源文件中用于以后断点定义的位置?


我使用这些标签在gdb中设置断点。因此,无论我在标签之后/之前添加/删除代码行,断点仍然是正确的。

如果我将-Wno-error=unused-label添加到编译选项中,编译器不会对我大喊大叫,但标签会从程序集中消失。

如果我在代码中使用__attribute__((unused)),结果是一样的:没有抱怨,但标签消失了。

有没有一种正确的方法来完成这件事(而不仅仅是黑客(?

这是我的玩具示例:

int main(void){
int a = 15;
label: __attribute__((unused))
a = a + 23;
return a;
}

编译后,结果为:

main:
push    ebp
mov     ebp, esp
sub     esp, 16
mov     DWORD PTR [ebp-4], 15
add     DWORD PTR [ebp-4], 23
mov     eax, DWORD PTR [ebp-4]
leave
ret

以下是同一示例的交互式版本:https://godbolt.org/z/zTqd9bM6q


$ gcc --version
gcc (GCC) 10.3.1 20210422 (Red Hat 10.3.1-1)
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

如果您想要一个不会被删除或重命名的标签,请尝试以下操作:

asm volatile("mylabel:");

请注意,带有此标签可能会影响GCC优化功能的方式。但是,volatile关键字可能有助于防止它做任何可能导致问题的事情。

还要注意,您可以使用__asm__而不是asm。两人似乎都在海湾合作委员会工作。

您可以使未使用的标签警告静音。。。通过使用它:

int main(int argc, char** argv) {
int a = 15;
goto label; label:
a = a + 23;
return a;
}

这将标签保留在程序集中(尽管使用内部名称(:

main:
.LFB0:
push    ebp
mov     ebp, esp
sub     esp, 16
mov     DWORD PTR [ebp-4], 15
nop
.L2:
add     DWORD PTR [ebp-4], 23
mov     eax, DWORD PTR [ebp-4]
leave
ret

我建议使用宏来减少工作量并更好地显示意图:

#define DEBUG_LABEL(x) goto x; x:

最新更新