g++的-D标志是什么作用?

35

我正在查看一个CFLAGS的值为 -

CFLAGS=-g -w -D LINUX -O3 -fpermissive

在Makefile中,-D标志的作用是什么?我在man页面上看到

-D name
    Predefine name as a macro, with definition 1. 

但我不知道如何解释它。我的理解是...它将 LINUX 变成一个宏,并且仅在 Linux 环境下执行 -03 和 -fpermissive。这是正确的吗?如果不是,那么是什么呢?感谢任何帮助。


3
通常,"-D" 会粘贴到后面的(定义的)名称上,例如 "-DLINUX" 或 "-DFOO=BAR"。 - Basile Starynkevitch
2个回答

39

它等同于在编译的源代码文件中添加语句#define LINUX 1。它对其他编译标志没有任何影响。原因是这是一种在代码中启用#ifdef语句的简单方法。因此,您可以拥有以下代码:

#ifdef LINUX
   foo;
#endif

仅当您使用-D标志控制的宏被启用时,它才会被启用。 因此,在编译时启用/禁用有条件的编译语句是一种简单的方法,而无需编辑源文件。


我会点赞,但是这个解释只正确到某个程度。-D 标志不会影响接下来的标志(例如使它们有条件或类似的疯狂说法),这是一个相当重要的区别。 - jpm
@jpm,你说得很好。我在第一次阅读时没有这样解释问题,但现在我看到你是正确的。我编辑了我的答案以澄清这一点。 - Gabriel Southern

3

这与 -O3 没有关系。基本上,它的意思与之相同。

#define LINUX 1

在编译文件的开头。


2
“-O3” 将编译器的优化级别设置为 3。 - jpm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接