- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
考虑以下程序:
#include <iostream>
int main = ( std::cout << "C++ is excellent!\n", 195 );
在Windows 7 OS上使用g++ 4.8.1 (mingw64),程序编译运行良好,打印:
C++ is excellent!
到控制台。 main
似乎是一个全局变量而不是一个函数;如果没有 main()
函数,这个程序如何执行?此代码是否符合 C++ 标准?程序的行为是否定义明确?我也使用了 -pedantic-errors
选项,但程序仍然可以编译和运行。
最佳答案
在深入探讨到底发生了什么之前,重要的是要指出根据 defect report 1886: Language linkage for main() 的程序格式错误。 :
[...] A program that declares a variable main at global scope or that declares the name main with C language linkage (in any namespace) is ill-formed. [...]
clang 和 gcc 的最新版本会导致此错误,程序将无法编译( see gcc live example ):
error: cannot declare '::main' to be a global variable
int main = ( std::cout << "C++ is excellent!\n", 195 );
^
那么为什么在旧版本的 gcc 和 clang 中没有诊断?直到 2014 年底,该缺陷报告甚至都没有提出解决方案,因此这个案例只是在最近才出现明显的错误,需要进行诊断。
在此之前,这似乎是未定义的行为,因为我们违反了第 3.6.1
节中的 C++ 标准草案 shall 要求 [ basic.start.main]:
A program shall contain a global function called main, which is the designated start of the program. [...]
未定义的行为是不可预测的,不需要诊断。我们在重现行为时看到的不一致是典型的未定义行为。
那么代码实际上在做什么,为什么在某些情况下它会产生结果?让我们看看我们有什么:
declarator
| initializer----------------------------------
| | |
v v v
int main = ( std::cout << "C++ is excellent!\n", 195 );
^ ^ ^
| | |
| | comma operator
| primary expression
global variable of type int
我们有 main
,它是一个在全局命名空间中声明并正在初始化的 int,该变量具有静态存储持续时间。在尝试调用 main
之前是否会进行初始化是由实现定义的,但似乎 gcc 在调用 main
之前会执行此操作。
代码使用 comma operator ,左操作数是一个丢弃的值表达式,在这里仅用于调用 std::cout
的副作用。逗号运算符的结果是右操作数,在这种情况下是纯右值 195
,它被分配给变量 main
。
我们可以看到sergej points out生成的程序集显示在静态初始化期间调用了 cout
。虽然更有趣的讨论点see live godbolt session会是这样的:
main:
.zero 4
及后续:
movl $195, main(%rip)
可能的情况是程序跳转到符号 main
并期望有效代码存在于 some cases will seg-fault 中。 .因此,如果是这种情况,我们希望在变量 main
中存储有效的机器代码可能会导致 workable program,假设我们位于允许代码执行的段中。我们可以看到this 1984 IOCCC entry just that .
看来我们可以使用 ( see it live ) 让 gcc 在 C 中执行此操作:
const int main = 195 ;
如果变量 main
不是 const 可能会出现段错误,可能是因为它不在可执行位置中,提示此 comment here这给了我这个想法。
另见 FUZxxl answer here到这个问题的 C 特定版本。
关于c++ - 具有称为 main 的全局变量而不是 main 函数的程序如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32851184/
有谁知道如何实现称为 PRUNING 的图像处理技术?任何想法,例子等?我正在使用 OpenCV 和 C#,如果有人可以提供帮助,我将不胜感激。 最佳答案 我假设您希望从图像中移除不需要的杂散和伪影。
假设我已经构建了一个可调用对象数组 callables = [] callables << block1 callables << block2 callables << block3 callabl
这个问题在这里已经有了答案: std::shared_ptr of this (2 个答案) 关闭 8 年前。 我正在学习 C++11 特性,特别是 shared_ptr,我在引用 this 并将其
我主要是一个oracle新手,所以如果这是一个愚蠢的问题,请原谅我...... 我已经阅读了很多关于 authID 的文章,我的理解是 AUTHID 子句指示 Oracle 是否以调用者的权限 (CU
我使用的是 Python 2.7。 按照惯例,__iter__、__init__、__str__ 等内置方法使用双下划线来标识它们。为什么 next() 函数没有这个? 它与这里的其他内置函数一起
这是疏忽吗?还是跟JVM有关? 最佳答案 Java 确实有指针——不能在指针上执行指针运算。 来自可敬的JLS : There are two kinds of types in the Java p
我越来越多地发现宣传“原生”桌面应用程序的服务,但在下载或研究后发现它们是在 Electron 或类似的 Web View 框架中构建的 Web View 。他们误解了“本地人”还是我? 另外,我可以
我尝试在 Wordpress 中使用,但它在控制台中显示 jstree 不是函数在 header PHP 文件中: /dist/libs/jquery.js"> /dist/themes/defaul
我想让 scons 调用带有目录列表的 nosetests。执行此操作的最佳方法是什么? 最佳答案 如果您需要分析外部应用程序的返回码(例如,如果您调用测试),您需要使用 Command() + py
这是一些尝试使用 OOB(紧急)数据的基本代码。我的问题是,如果客户端使用 C 或 Java,则服务器部分的行为不同。请注意,您可能认为这两个客户端都有些棘手,但如果我使用 C 服务器(以更好地控制
虚拟文件系统 (VFS) 或虚拟文件系统交换机是更具体文件系统之上的抽象层。 VFS的目的是允许客户端应用程序以统一的方式访问不同类型的具体文件系统。 如果我们看到 VFS 的实际工作,这个定义似乎是
"Effective Go"状态: By convention, one-method interfaces are named by the method name plus an -er suff
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题吗? 更新问题,以便 editing this post 提供事实和引用来回答它. 关闭 3 个月前。 社区审核了是否
在深入研究 Scala 时,我遇到了 这个词。类型类 . 它一直令人困惑,因为一个类是一个类型,而一个类型可以 在 Scala 中是一个类,“类型”和“类”本身就是抽象术语。 在阅读了一些示例后,我感
我正在尝试编写一个简单地杀死我的程序的函数。它被称为退出聊天。但是,当我调用函数 messenger:quitChat() 时,出现此错误。 ** exception error: bad argum
我正在尝试编写一个简单地杀死我的程序的函数。它被称为退出聊天。但是,当我调用函数 messenger:quitChat() 时,出现此错误。 ** exception error: bad argum
如果您向 DB2/zOS 引擎 DBA 询问有关 DB2 行为的问题,DBA 会将 DB2 引擎称为“他”,就像水手使用“她”来指代他的船一样。 例如:“一旦您填充了可用空间,DB2 仍希望在表空间中
案例:我有 2 个具有以下 OneToMany 关系的表:TagAbstract 1..* TagConf,其中: tag_abstract_ID 是一个字段,用于标识许多 TagConf 记录,这些
我有一个表格,我想让第一行“自动固定”(这意味着当向下滚动时它固定在顶部,而如果不向下滚动,它就不固定)。这是代码:``` table { background: yellow; } td
其他动词对我来说都有意义,但我对“发布”作为动词没有太多上下文。它是像在邮局发帖(这有一定道理,虽然看起来有点牵强)还是像在公告板上发帖(对我来说意义不大)?有谁知道是谁决定了“POST”以及为什么选
我是一名优秀的程序员,十分优秀!