我正在寻找一种方法将预处理器令牌转换为字符串.
具体来说,我在某处得到了:
#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)
我愿意通过其他方式来完成同样的事情,但仅限标准库.
我有一个使用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指向这个版本而不是空版本.但是,我确信这是一个非常粗糙的解决方案,我不确定它是否会起作用.
任何人都可以提出一种更优雅的方法来全局定义或创建变量,使解决方案中的每个文件都可以看到它吗?