c++ 在大多数人的代码中,ONLINE_JUDGE是什么?

xxls0lw8  于 2023-01-03  发布在  其他
关注(0)|答案(4)|浏览(266)

大多数人在他们的代码中写这个。
这是什么意思?
#ifndef有什么用。

#ifndef ONLINE_JUDGE
   freopen("E://ADpan//in.in", "r", stdin);
   freopen("E://ADpan//out.out", "w", stdout);
#endif
oyxsuwqo

oyxsuwqo1#

粗略的谷歌搜索一下就找到了this post。在一些在线编码竞赛中,预定义的输入被发送到stdin,并期望在stdout上进行。当在本地测试和开发时,一些人更喜欢破解他们的程序以从文件中读取,这样他们就不必执行以下操作

test_program < input | diff - expected_output

最后,ONLINE_JUDGE宏是在竞争环境中定义的,因此使用stdin/stdout,而本地编译将不具有该宏,因此从这些文件读取。

k75qkfdt

k75qkfdt2#

此行代码由在文本编辑器而不是IDE中编写代码的竞争程序员使用。默认情况下,在大多数在线评审中提交代码时定义ONLINE_JUDGE常量,例如:codeforces或codechef。它帮助代码确定代码是在在线法官还是在本地系统机器上运行。该行代码用于代码在本地机器上运行时从文件而不是stdin进行读写,以及在在线法官中运行时分别从stdin和stdout进行阅读。

k75qkfdt

k75qkfdt3#

作为一个有竞争力的程序员,我经常使用这个方法。这意味着在测试和实现过程中,你可以做一些特定的事情--在这个例子中,你从文件中阅读stdinstdout,以使调试更容易。当代码在线编译和提交时,ONLINE_JUDGE标志被设置,这样它就不会运行,他们可以使用特定的文件来验证你的程序。

x759pob2

x759pob24#

关于freopen()的第一部分问题:在竞争性程序设计中,许多竞赛都要求输入输出符合标准的输入输出要求(例如,许多USACO问题)要求您从文件中读取和写入。freopen()命令在<stdio.h>头文件中定义,并允许您将输入/输出流重定向到文件。您可以选择读取或写入文件,以及一些其他操作文件的方法,如append。文档可以在here中找到。
为了回答问题的第二部分"#ifndef是什么",您需要了解以下几点:

  • C++预处理器在将代码传递给编译器之前对代码执行初步操作。例如,您可以定义某些快捷方式,使编程过程更容易。
  • #include "filename"指令将替换为文件的文本内容。文件可以相互包含,例如,"Person1.h"可以包含"Person2.h",反之亦然。
  • 在C++中,类和函数在整个程序中只能定义一次(重载除外)。

现在,回答你的问题:#ifndef是一个预处理器指令,代表"if not defined",它总是与#define#endif成对出现,通常用作include guard。这可以防止文件无限地相互包含,或者每个文件定义相同的类/函数两次,这两种情况都会导致错误。例如:

//file "person1.h"
#include "person2.h"
#ifndef PERSON1_H
#define PERSON1_H
class Person {
    int age;
};
#endif
//file "person2.h"
#include "person1.h"
#ifndef PERSON2_H
#define PERSON2_H
class Person {
    int age;
};
#endif

如果你没有把#ifndef放在上面的文件中,那么person1.h会用person2.h的文本内容替换第一行,但是注意person2.h也有一个#include person1.h,这会产生一个无限循环,另外,你也会定义两次Person类,这是非法的。

相关问题