1. 程式人生 > 實用技巧 >C++ 增加預處理巨集的方法

C++ 增加預處理巨集的方法

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型別沒有特意去寫,感覺沒有必要。