getChar_unlocked在Windows中未申报

getchar_unlocked in windows undeclared

本文关键字:Windows unlocked getChar      更新时间:2023-10-16

这是我的代码:

#include <stdio.h>
void scan(int* i)
{
    int t=0;
    char c;
    bool negative=false;
    c=getchar_unlocked();
    while(c<'0'&&c>'9')
    {
        if(c=='-')
            negative=true;
        c=getchar_unlocked();
    }
    while(c>'0'&&c<'9')
    {
        t=(t<<3)+(t<<1)+c-'0';
        c=getchar_unlocked();
    }
    if(negative)
        t=~(t-1); //negative
    *i=t;
}
int main(int argc, char const *argv[])
{
    int i;
    scan(&i);
    return 0;
}

我知道此处定义为scan的功能比scanf快,并且在编程竞赛中非常有用。但是由于某种原因,此代码无法在Windows上使用,而是在Linux上工作。我该怎么做才能使其在Windows上工作?我正在使用Dev-C 的g++编译器。

getchar_unlocked不是C 标准功能,因此它在Windows上不起作用也就不足为奇了。我认为这是一个POSIX标准,但是Windows编译器不支持所有POSIX函数。

如果您用getchar替换getchar_unlocked,则可以使用,尽管该算法似乎不太正确。

您可以通过有条件的汇编进行此操作,例如

#ifdef _WINDOWS
// no getchar_unlocked on Windows so just call getchar
inline int getchar_unlocked() { return getchar(); }
#endif

Windows具有等效的,_GetChar_Nolock,它是Windows特定的。

请参阅此链接:

https://msdn.microsoft.com/en-us/library/4y2e9z0c.aspx

因此,如果您对非thearreadSafe版本感到满意,并且想要最好的性能,您可以做这样的事情:

#ifdef WIN32
// no getchar_unlocked on Windows so call _getchar_nolock
inline int getchar_unlocked() { return _getchar_nolock(); }
#endif

getchar_unlocked()主要用于竞争性编程,但是,如果要在其他地方使用它,只需确保一次只使用1个线程即可。同样适用于putchar_unlocked()函数。它是一个同等的POSIX,因此Windows编译器不支持它。但是,您可以使用两个 -

之一
  1. 正常速度

    int getchar_unlocked(){return getchar();}void putchar_unlocked(char _c){putchar(_C);}

  2. 快速速度

    int getchar_unlocked(){return _getChar_nolock();}void putchar_unlocked(char _c){_putchar_nolock(_C);}