C++ c++;

C++ c++;,c++,C++,我最近遇到了这段代码,它可以编译,但运行时带有分段错误(g++)。 这是topcoder的原始链接 有人能解释一下这个节目里发生了什么吗。使用G++ < P>对不起,您所发布的代码不是有效的C++程序。有效的C++程序必须具有一个入口点,该入口点是全局范围内的名称主< /代码>的函数,其中的一个签名是由标准所指定的签名。C++中最短的有效程序是: int main(){} 这都是愚蠢的游戏。两个程序都违反了“程序应包含名为main”的全局函数”(3.6.1p1)的要求。这些程序可能会愚弄某些

我最近遇到了这段代码,它可以编译,但运行时带有分段错误(g++)。 这是topcoder的原始链接


有人能解释一下这个节目里发生了什么吗。使用G++

< P>对不起,您所发布的代码不是有效的C++程序。有效的C++程序必须具有一个入口点,该入口点是全局范围内的名称<代码>主< /代码>的函数,其中的一个签名是由标准所指定的签名。C++中最短的有效程序是:

int main(){}

这都是愚蠢的游戏。两个程序都违反了“程序应包含名为
main
”的全局函数”(3.6.1p1)的要求。这些程序可能会愚弄某些编译器,因为它们定义了一个符号
main
,但该符号根本不是函数!难怪当运行时试图使用
main
符号作为函数时,其中至少有一个会崩溃

托管实现中最短的有效C++03程序:

int main(){}

如果您真的对可执行文件的大小感兴趣,那么代码行数其实并不重要,至少对我来说不重要。重要的是机器指令和文件的大小。这里有两个非常棒的链接:

  • 关于为Linux创建非常小的ELF可执行文件
  • (可移植可执行文件,win32和x64可执行文件格式)

简而言之,最小的可执行文件不一定取决于代码行数,而是取决于除此之外的许多其他因素。在我看来,这是一个非常有趣的工程。

以下代码可以工作:

charmain[]=“\xb4\x00\xcd\x16\xcd\x20”

这会将以下机器级代码分配给符号main,它是一个字符数组

mov ah,0
int 16h ; Wait for a keyboard input i.e getch();
int 20h ;  Exit to DOS

编译器看到主符号并正确编译代码。它将控件传递给symbol main(这是C/C++编译器的默认操作),在那里查找机器代码。因此,它执行正确。

< P>最小的C++程序是:

int main(){}


输出:

你认为最短的是什么?最短的C++程序长0个字符。这两个程序是不同的吗?或者同一个程序的两个部分?这里有太多的错误,我甚至不知道从哪里开始。这两个都不是有效的程序。如果您的实现碰巧生成了一个可执行文件或允许其中任何一个运行,这是实现的一个不幸后果(以及您使用的语言本身无法检查所有可能的错误条件的事实)。我知道,应该没有不好的问题,但这真的没用。@John Dibling:我刚刚发布了这个问题,因为它来自排名121的topcoder成员,别忘了新词。:-)根据第16节中描述的预处理语法,标记后面必须跟一个换行符,否则翻译单元在语法上无效。当然,大多数编译器都会接受没有最后换行符的文件。@Billy:2.1/1:“如果不是空的源文件没有以换行符结尾,或者以紧跟在反斜杠前面的换行符结尾,则行为是未定义的。”。所以,这取决于您想要的是一个有效的程序,还是一个具有定义行为的有效程序。@Steve@aschepler:Bill运行并开始查看他的代码库,以了解这一点……@R@Billy ONeal在较旧/当前版本的C/C++中,从技术上讲,您需要换行符(尽管大多数编译器不会抱怨),但在C++0x中,此限制已被删除。它不会导致未定义的行为,main可能不返回任何内容,在这种情况下返回零。编译器是否添加了
返回0是否缺少一个?或者这些行中有什么东西吗?请注意,此自动
返回0
仅适用于
main
。忘记了这个异常(实际上不应该使用)。谢谢你的更正。为什么不应该使用它呢?它有明确的行为;我自己看不出有什么缺点。@Muggen谢谢。。。我想精灵一号可能有点过时了;在linux完全拒绝之前,我无法到达他们那么远的地方。x64的情况可能已经改变。如果我今年有空,没有考试、工作、投标或其他任何事情,我就自己去试试。。。!虽然这些链接很有趣,但我认为从372字节到45字节的步骤没有什么实际意义,而将看似微不足道但有用的程序从磁盘上的50k减少到5k,或将驻留大小从500k减少到24k的步骤更有趣。@R我不同意你的看法。我只是出于兴趣才把它们贴出来的。
int main(){}
mov ah,0
int 16h ; Wait for a keyboard input i.e getch();
int 20h ;  Exit to DOS