我试图编写一个功能,其行为取决于操作系统。

我在函数中的某处获得了以下代码:

#ifdef OS_WINDOWS
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    int cols;
    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
    cols = csbi.srWindow.Right - csbi.srWindow.Left + 1;
    #else
        int cols;
        #ifdef TIOCGSIZE
        struct ttysize ts;
        ioctl(STDIN_FILENO, TIOCGSIZE, &ts);
        cols = ts.ts_cols;
        #elif defined(TIOCGWINSZ)
        struct winsize ts;
        ioctl(STDIN_FILENO, TIOCGWINSZ, &ts);
        cols = ts.ws_col;
        #endif // TIOCGSIZE
    #endif // OS_WINDOWS


因此,我想获取列数,但是对于Windows和Linux,这需要以两种不同的方式来完成...然后,我想继续使用cols变量。但我得到variable 'cols' is uninitialized when used here

如何从宏块中“提取” cols变量?

最佳答案

编译器在Windows上看到的内容

CONSOLE_SCREEN_BUFFER_INFO csbi;
int cols; //This is the only place where `cols` is delcared!
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
cols = csbi.srWindow.Right - csbi.srWindow.Left + 1;


编译器在Windows上看不到的内容

    struct ttysize ts;
    ioctl(STDIN_FILENO, TIOCGSIZE, &ts);
    cols = ts.ts_cols; //cols is not declared


要么

    struct winsize ts;
    ioctl(STDIN_FILENO, TIOCGWINSZ, &ts);
    cols = ts.ws_col; //cols is not declared


请注意,非Windows代码中没有cols声明。

一个简单的解决方案是将cols的缩放比例移到宏块之前。

int cols = 0; //or -1 or some other error value
#ifdef OS_WINDOWS
CONSOLE_SCREEN_BUFFER_INFO csbi;
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
//...


作为预处理器宏的注释:
预处理程序在编译代码之前运行,处理#include#define(替换文本),#ifdef(有条件地包括代码块)等等。编辑器和IDE可能会将未使用的块显示为灰色,但是您也可以单独查看预处理器的输出(编译器标志取决于您的编译器),这可以帮助您找到出现错误的原因。

关于c++ - 从宏块中提取变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32658849/

10-12 07:03