为什么链接器在下面的代码中没有发出错误?

若昂·阿方索

我在这里找到下面的例子显然,代码段中的注释是错误的,因为该变量S::x已由表达式使用&S::x

struct S { static const int x = 1; };
void f() { &S::x; } // discarded-value expression does not odr-use S::x
int main(){
    f();
}

查看现场示例

我了解编译器不需要发出此类错误,因为[basic.def.odr] / 10表示“无需诊断”。但是,为什么链接器不发出未定义变量的错误S::x,如下面的代码所示?

#include<iostream>
struct S { static const int x = 1; } s;

int main() {
    std::cout << &s.x << '\n';
}  

参见现场示例

克劳斯

但是,为什么链接器不会像下面的代码中那样发出未定义变量S :: x的错误?

因为它只是被优化了!结果永远不会使用且没有副作用的表达式将被忽略。并且被忽略的内容也不能链接进来。根本没有代码引用该变量,即使该变量的地址已被使用但未被使用也是如此。

如您的wandbox示例所示,编译器发出正确的诊断信息:“未使用表达式结果”。

未使用的代码以后不会导致链接器错误;)

您的第二个示例使用值(var的地址),因此需要评估表达式。这会向链接器发出代码,该链接器在任何地方都找不到地址的符号。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我没有收到任何错误在下面的代码?

为什么我的控制器没有在下面的代码中注册?

为什么 $scope 在下面的代码中没有定义在这里

为什么这个while循环没有在下面的代码中结束?

为什么在下面的代码中“ someVariable”变量的值没有变化

为什么下面的Parse代码没有返回错误?

为什么下面的代码编译没有错误?

为什么scanf()函数没有等我在下面的代码中最后输入char

在下面的代码中,为什么会提示“OUCH”?

为什么下面的代码会抛出错误?

为什么下面的代码会打印堆栈跟踪,为什么 return 语句中的 a.toString() 没有给出错误或异常?

在下面的PLSQL触发器中,为什么将所有内容都在数据透视代码中转换为AS VARCHAR2?

为什么下面的代码编译时没有错误?

为什么下面的代码片段没有给出编译时错误?

为什么我在下面的代码中收到此错误“方法 getHeader(String) 未定义为类型 HttpRequest”?

如何修复此错误“ numpy.ndarray”对象,在下面的代码中没有属性“ append”

为什么下面的代码有语法错误?

在下面的代码中从int转换为float时,为什么会有价值损失?

为什么 HTML 在我下面的代码片段中没有采用 a、b、c 的值?

为什么下面的代码没有在 C# 中返回预期的输出?

为什么输出是这在下面的Java代码?

有什么特殊的原因为什么在下面显示的代码片段中没有省略move构造函数?

为什么在下面的代码中MRO在python中是反向的?

我在下面的程序中使用angularjs在php上工作,我没有从ajax call获得任何响应。我没有在下面的代码中得到什么错了

为什么在下面的代码中两次调用了复制构造函数?

为什么在下面的代码中printf()打印0而不是10?

为什么在下面的Go代码中不能使用空白标识符?

为什么.append()在下面的代码中替换tbody的内容?

为什么Dart无法在下面的代码中找出类实例变量