Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 重新定义宏时会发生什么?_C++_C_Macros - Fatal编程技术网

C++ 重新定义宏时会发生什么?

C++ 重新定义宏时会发生什么?,c++,c,macros,C++,C,Macros,我的值是3还是45?来自标准(草案): 当前定义为类对象宏(见下文)的标识符可以由另一个#define重新定义 预处理指令提供了第二个定义是类似对象的宏定义和两个 替换列表是相同的,否则程序格式不正确。[……] 重新定义宏时会发生什么 当新定义不同时,您的程序格式不正确。编译器需要向您显示诊断消息(警告或错误)。标准未定义格式错误程序的行为。编译器可以自由地拒绝编译程序 我的_值是3还是45 无论预处理器/编译器选择什么。或者编译器可能会拒绝编译它 从技术上讲,如果先取消定义宏,程序将变得格

我的值是3还是45?

来自标准(草案):

当前定义为类对象宏(见下文)的标识符可以由另一个#define重新定义 预处理指令提供了第二个定义是类似对象的宏定义和两个 替换列表是相同的,否则程序格式不正确。[……]


重新定义宏时会发生什么

当新定义不同时,您的程序格式不正确。编译器需要向您显示诊断消息(警告或错误)。标准未定义格式错误程序的行为。编译器可以自由地拒绝编译程序

我的_值是3还是45

无论预处理器/编译器选择什么。或者编译器可能会拒绝编译它


从技术上讲,如果先取消定义宏,程序将变得格式良好。那么定义的值显然就是新定义的值。但是,我不建议这样做,因为根据在多个翻译单元中包含标题的顺序,您可以很容易地打破其他规则

最有可能的情况是,这两个宏应该是独立的实体,并且存在不同的文件,它们期望从一个头而不是另一个头中定义。正确的解决方案是通过重命名一个文件来为每个文件指定一个唯一的名称,并将从属文件更改为使用新名称。弄清楚哪些文件使用哪个定义可能是一个挑战。当您使用宏时,您可能想用
constexpr
变量替换宏。

我想

重新定义宏时会发生什么

它为宏提供重新定义警告

仍然

如果您避免警告并尝试运行您的程序

我们所知道的是,在cpp中,所有语句都是从上到下顺序执行的,所以不管最后一个宏定义是什么,都会打印出来

我的_值是3还是45


在您的代码中,45将作为宏定义。

您尝试了什么?发生了什么事?@AbdusSalamKhazi如果你有一个大型项目,你不应该有两个不同值的宏。移除哪一个取决于具体情况。您应该详细地查看它,并删除不正确的代码。只有通过研究和理解代码,并确定其行为方式,您才能知道这一点。如果你出于任何原因(为什么?)无法做到这一点,请向团队中的同事寻求帮助。@Asu-很好的建议!除非你错了。C++不是一个好的语言,只是说“试试”,因为它有。(). 然而,这并不是处处都能保证的!constexpr的用途是什么?@AbdusSalamKhazi它允许您在需要常量表达式的上下文中使用变量。因此,尝试在没有
#undef
的情况下重新定义宏具有实现定义的行为?@Sapphire\u Brick尝试这样做会使程序在定义更改时格式错误。实现不需要记录其行为。
#define MY_MACRO 3 --> in A.h
#define MY_MACRO 45 --> B.h
//In C.cpp

#include "A.h"
#include "B.h"

..
..
..
int my_value = MY_MACRO;