C++ 增加預處理巨集的方法
阿新 • • 發佈:2020-09-01
C++ 增加預處理巨集的方法
前幾天寫題的時候發現,我使用的fread
在oj上並沒有比執行了ios::sync_with_stdio(false)
的cin
更快,最後發現並不是fread
的問題,而是因為我增加了這樣一條資訊
#ifdef _WIN32
return getchar();
#endif
而在一些oj上,評測環境也是windows,所以導致了我的fread
直接變成getchar()
了,而使用getchar()
進行快讀日常負優化,我就開始找怎麼避免這個問題,最後發現可以編譯時可以在本地增加預處理巨集,具體如下
"-D MACRO_NAME macro.c", //增加預處理巨集
這樣就會在編譯時增加一個MACRO_NAME
的巨集,然後把ifdef
後面的_WIN32
換成你定義的巨集名稱即可
對於vscode,直接在tasks.json中的args引數中增加這一條指令即可
fread模板
最後附一下更新後的fread
模板
struct READ { inline char read() { #ifdef Artoriax return getchar(); #endif const int LEN = 1 << 18 | 1; static char buf[LEN], *s, *t; return (s == t) && (t = (s = buf) + fread(buf, 1, LEN, stdin)), s == t ? -1 : *s++; } inline READ & operator >> (char *s) { char ch; while (isspace(ch = read()) && ~ch); while (!isspace(ch) && ~ch) *s++ = ch, ch = read(); *s = '\0'; return *this; } inline READ & operator >> (string &s) { s = ""; char ch; while (isspace(ch = read()) && ~ch); while (!isspace(ch) && ~ch) s += ch, ch = read(); return *this; } template <typename _Tp> inline READ & operator >> (_Tp&x) { char ch, flag; for(ch = read(),flag = 0; !isdigit(ch) && ~ch; ch = read()) flag |= ch == '-'; for(x = 0; isdigit(ch); ch = read()) x = x * 10 + (ch ^ '0'); flag && (x = -x); return *this; } } in;
可以直接讀入字串了,對於double型別沒有特意去寫,感覺沒有必要。