我试图编写一个功能,其行为取决于操作系统。
我在函数中的某处获得了以下代码:
#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/