gpt4 book ai didi

c++ - 从宏 block 中提取变量

转载 作者:行者123 更新时间:2023-11-28 00:11:48 26 4
gpt4 key购买 nike

我正在尝试编写一个根据操作系统表现不同的函数。

我在函数的某个地方得到了这段代码:

#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

如何从宏 block 中“提取”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 的 decalration 移动到宏 block 之前。

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 可能会将未使用的 block 显示为灰色,但您也可以单独查看预处理器输出(编译器标志取决于您的编译器),这可能有助于您找到出现错误的原因。

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com