我有以下代码,我想在使用GCC 4.8的Linux上工作
这适用于VS 2013
#ifdef __linux__
#include <unistd.h>
#endif
#ifdef __linux__
if ( access( trigger->c_str(), 0 ) != -1 )
{
...
}
#else
if ( _access( trigger->c_str(), 0 ) != -1 )
{
...
}
#endif
我知道在Linux上我可以使用函数:来自“unistd.h”的访问
有没有办法避免使用以下内容(更优雅的解决方案)?
logger
答案 0 :(得分:6)
一个没有重复的解决方案,也不依赖于宏定义(除了用于平台检测的预定义的宏定义),但是比Aracthor的解决方案具有更多的样板:
#ifdef _WIN32
inline int access(const char *pathname, int mode) {
return _access(pathname, mode);
}
#else
#include <unistd.h>
#endif
我更喜欢检测窗口,并使用posix作为后退,因为windows往往比linux更常见。
另一个干净的解决方案是定义_CRT_NONSTDC_NO_WARNINGS
并在Windows中继续使用POSIX标准access
,而不会有关于弃用的警告。作为奖励,这也会禁用使用标准strcpy
而不是strcpy_s
和类似的警告。后者也是标准的(在C11中),但是可选的,几乎没有任何其他C库实现它们(并且,并非msvc中的所有_s
族函数都符合C11)。
答案 1 :(得分:3)
还有另一种方法,即仅限标题的解决方案。
#ifdef __linux__
#include <unistd.h>
#else
#define access _access
#endif
if ( access( trigger->c_str(), 0 ) != -1 )
{
...
}
它将在Linux系统上包含正确的文件,并在其他系统上将access
替换为_access
。