如何用 dev c++ 写代码
如何用 dev c++ 写代码
在 noip 考场上只提供 dev c++, 用 dev c++ 写代码很容易把我们给累死, 那么本文从语言层面分析了怎么用 dev c++ 写代码才能稍微舒适一些.
重要声明, 重要声明, 重要声明.
我平时在 unix 或 linux 上写代码, 非常不喜欢也不习惯 windows.
所以我提供的设置都是让 linuxer 在只能用 c++ 2011 的情况下而且在 windows 里写代码的时候更舒适的写代码用的.
如果是工程中就不要用这里面的大多数方式.
如果你本身就习惯 windows 那么祝你平安.
自力更生, 艰苦奋斗.
语言标准
noip 的标准是 c++ 2014. 但 dev c++ 的 g++ 4.8.4 只提供 c++ 1998, c++ 2003, c++ 2011. 所以我们使用 c++ 2011.
在编译选项里加上 -std=c++11 -O2 就好了.
代码补全
我非常不喜欢代码补全, 任何 ide 的代码补全都不喜欢, 所以打开 dev c++ 第一件事就是关掉代码补全.
long 的大小问题
因为 windows 上的 long 是 \(32\) 位, 不符合 lp64, 很容易把我们给气死.
所以我们在所有 #include 之后使用 (注意: 请千万千万要在所有 #include 之后再使用):
#define long std::int64_t
这里我用了宏, 不符合 lil_tea c++ 2026 style guide, 但这是身不由己的无奈之举, 没办法的事.
注意在文件末尾尽量加一行 (不加也不会有事):
#undef long
注意: 这样就不能再用 std::scanf 和 std::printf 了, 我非常不建议使用快读, 建议使用关同步 std::cin std::cout.
再有就是说, long double 会变成 std::int64_t double, 所以 long double 没法用了, 不过 noip 环境 double 足够.
字面量问题
因为重定义了 long, 所以也就不能再使用 0l 的 l 后缀当 long 了, 也不能再用 0ul 的 ul 后缀当 unsigned long 了.
而我又非常不喜欢写 0ll 和 0ull 所以我得自己创建个后缀.
我把目光投向了 c++ 2023 的 0z 和 0uz, 0z 是 long, 0uz 是 unsigned long, 而且都是 \(64\) 位.
既然 c++ 2023 能设计 0z 和 0uz, 那我也能设计 0_z 和 0_uz.
这个就很简单了:
constexpr std::int64_t operator ""_z(unsigned long long x) {
return x;
}
constexpr std::size_t operator ""_uz(unsigned long long x) {
return x;
}
注意: 参数列表里出现了 long 标识符, 所以需要放在 #define long std::int64_t 的前面.
我喜欢用 long 当整数类型, std::size_t 当数组的偏移量类型, 如果你喜欢别的类型的话也可以.
如果你发现 ""_z 会在 g++ 4.8.4 里编译错误, 请使用 ""z, 但这确实是不符合 c++ 2011 的, c++ 2011 规定的是下划线开头的后缀才能是用户定义的后缀.
换行符问题
dev c++ 默认就是 lf 换行, 还好.
如果你要输出换行, 信任 std::endl 就好了, 如果嫌慢可以用 "\n".
常量问题
如果你发现 g++ 4.8.4 不支持 constexpr, 请大骂 fuck 并改成 const.
最终代码框架 (可以用 g++-16 -std=c++11 编译, 大概率也能用 dev c++ 提供的 g++-4 -std=c++11 编译)
#include <bits/stdc++.h> // 所有 dev c++ 都可以用万能头, 万能头符合 [lil\_tea c++ 2026 style guide](https://www.cnblogs.com/young-tea/p/19815137), noip 和工程中都推荐使用
// using namespace std; // 禁止写这行
constexpr std::int64_t operator ""_z(unsigned long long x) {
return x;
}
constexpr std::size_t operator ""_uz(unsigned long long x) {
return x;
}
#define long std::int64_t
long nxt(void) {
long x;
std::cin >> x;
return x;
}
/*
prob link:
start think:
term think:
start code:
term code:
*/
constexpr long k_inf = 0x3f3f3f3f3f3f3f3f_z;
constexpr long k_mod = 0x3b800001_z;
constexpr std::size_t arr_len = 1_uz << 18;
void solve(void) {
}
signed main(void) {
// std::freopen(".in", "r", stdin);
// std::freopen(".out", "w", stdout);
std::ios::sync_with_stdio(0);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
long _ = 1;
// _ = nxt();
while (_--)
solve();
std::cout.flush();
return EXIT_SUCCESS;
}
#undef long

浙公网安备 33010602011771号