禁用编译输出
Disable compile out
有没有办法指示g++或clang不要编译出代码中没有使用的变量?我知道大多数编译器都会编译出不影响最终输出的代码部分。出于调试原因,我想知道是否有办法禁用它?
是。在gcc(可能还有clang)中,您可以使用-O0
进行编译。这将禁用所有优化。您也可以使用-Og
,它不应该删除变量。此标志仅启用"调试器友好型"优化。
只需声明变量volatile
。这具有在任何编译器上工作的优势,而不需要编译器特定的扩展或命令行选项——它还允许您明确哪些变量得到这种处理。如果你想删除易失性的版本,你可以使用以下方法:
#if defined NDEBUG
#define DEBUG_VOLATILE
#else
#define DEBUG_VOLATILE volatile
#endif
然后声明,例如:
DEBUG_VOLATILE debug_var = 0 ;
仅在调试构建中是可变的。
也许:
int foobar __attribute__((used));
文件http://gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html说(强调):
此属性附加到具有[sic]static存储的变量,意味着即使变量看起来没有被引用,也必须发出该变量。
更新1:也许这是https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem也就是说,你真正想要解决的问题是什么?
无论如何,正如dma在评论中指出的那样,这种解决方案会受到影响,因为"对于非调试构建,添加到代码中的任何内容都将更难删除"。同意。
更新2:使用-s
:编译此4行文件
int foo1 = 111;
static int foo2 = 222;
static int volatile foo3 = 333;
static int __attribute__((used)) foo4 = 444;
给出(节略):
.globl foo1
.data
foo1:
.long 111
foo4:
.long 444
也就是说,使用Clifford对volatile
的建议,变量foo3
被编译出,而foo4
被保留。(gcc 4.1.2)
但是,另一方面,编译:
void bar(void) {
int bar2 = 222;
int volatile bar3 = 333;
int __attribute__ ((used)) bar4 = 444;
}
给出:
警告:已忽略"used"属性
和:
movl $333, -4(%ebp)
所以情况正好相反:volatile
起作用,__attribute__ ((used))
不起作用(也许是意料之中的,因为bar4
不是static
)。
- 编译并运行后,输出未出现在 Visual Studio 代码中
- std::cout输出int时出现编译错误
- 在由Sublime文本3编译后在cmd上显示Java程序输出
- 这是使用回溯的 nqueen 问题,但我使用了动态 2d 数组,我的程序编译良好,但不返回任何输出
- 代码编译没有任何输出,入门程序
- 编译 gsoap 输出文件 (onvif) 时出现问题
- 如何在编译过程中输出C 类型信息
- Linux MinGW:在编译时,他输出了 8 个"nultiple definitions"列表
- 将char8_t const* 输出到 cout 和 wcout,一个编译一个不编译
- GCC 预处理器输出和编译一次通过,v2
- 已编译的 protobuf 文件的意外输出路径
- Visual Studio 编译的程序在尝试减小输出大小后无法正确初始化
- 尝试用 c++ 制作一个简单的加法器.编译成功,但输出错误
- Protobuf:了解原型文件的编译输出
- 二进制搜索 - 代码编译并运行后不显示输出
- 代码可以编译,但没有输出
- 在不同于依赖DLL的文件夹中输出已编译目标的正确方法是什么
- C++程序读取ppm和pgm文件,对其进行操作并输出.编译错误
- 从程序中得到错误的输出.编译时没有错误
- 如何在Visual c++编译期间输出编译时数字常量?