相关疑难解决方法(0)

将预处理程序标记转换为字符串

我正在寻找一种方法将预处理器令牌转换为字符串.

具体来说,我在某处得到了:

#define MAX_LEN 16
Run Code Online (Sandbox Code Playgroud)

我想用它来防止缓冲区溢出:

char val[MAX_LEN+1]; // room for \0
sscanf(buf, "%"MAX_LEN"s", val);
Run Code Online (Sandbox Code Playgroud)

我愿意通过其他方式来完成同样的事情,但仅限标准库.

c stringification c-preprocessor

60
推荐指数
3
解决办法
7万
查看次数

解决方案范围在Visual Studio中定义?

我有一个使用Visual Studio 2008构建的非常大的应用程序,它可以在Windows XP上运行.该代码由一个包含六个独立项目的解决方案文件组成.我的工作是将此应用程序移植到Linux上运行.我之前没有做过这样的事.

我昨天发现我的公司希望这个代码在我完成之后仍然可以在Windows上编译.我实现这一目标的第一个想法是使用预处理器语句,例如:

#define COMPILE_FOR_LINUX
Run Code Online (Sandbox Code Playgroud)

然后,我可以使用预处理器块告诉编译器哪些文件包含在头文件中,如下所示:

#ifdef COMPILE_FOR_LINUX
// include required Linux headers here and skip Windows header includes
#else
// include required Windows headers here and skip Linux header includes
#endif
Run Code Online (Sandbox Code Playgroud)

在包含适当的文件之后,我可以使用以下块来封装所有与平台相关的代码:

#ifdef COMPILE_FOR_LINUX
// compile Linux specific code used here.
#else
// compile Windows specific code used here.
#endif
Run Code Online (Sandbox Code Playgroud)

为了让某人能够轻松地为他们的首选平台编译应用程序,我想在一个地方指定COMPILE_FOR_LINUX.但是,我不知道如何做到这一点.

我的一个想法是创建一个空头文件,然后让解决方案中的每个文件都包含Visual Studio解决方案文件包含路径中指定的头文件.对于Linux,我有另一个版本的头文件定义COMPILE_FOR_LINUX,然后让makefile指向这个版本而不是空版本.但是,我确信这是一个非常粗糙的解决方案,我不确定它是否会起作用.

任何人都可以提出一种更优雅的方法来全局定义或创建变量,使解决方案中的每个文件都可以看到它吗?

c++ linux porting global-variables visual-studio-2008

5
推荐指数
1
解决办法
2767
查看次数