BCS*_*BCS 5 c linux posix conditional-compilation
Linux有这个很好的功能dprintf:
的功能
dprintf()和vdprintf()(如在glibc2的库中找到)是精确的类似物fprintf()和vfprintf(),除了它们输出到一个文件描述符fd代替给定的流.
但同样的消息来源指出:
这些函数是GNU扩展,而不是C或POSIX.很明显,名字被严格挑选.许多系统(如MacOS)都有不兼容的函数调用
dprintf(),通常是一些调试版本printf(),也许就像原型一样
void dprintf (int level, const char *format, ...);
Run Code Online (Sandbox Code Playgroud)
其中第一个参数是调试级别(输出是
stderr).此外,dprintf()(或DPRINTF)也是用于调试的流行宏名称printf.因此,可能最好在可移植的程序中避免使用此功能.
我如何进行安全调用dprintf我想要的设置,如果它存在,或者如果该功能不存在则无法使用一些合理的错误消息进行编译?我想我会做这样的事情:
#ifdef SOMETHING
#define Dprintf dprintf
#else
#error "no dprintf"
#endif
Run Code Online (Sandbox Code Playgroud)
但我不知道SOMETHING应该是什么.我想我可以将它限制在只有Linux但我可以让它更宽松吗?
看起来dprintf()实际上是在POSIX.1-2008(带有你想要的语义),所以你可以这样做:
#if !defined(__GLIBC__) && _POSIX_C_SOURCE < 200809
#error "dprintf may not exist, or may be wrong"
#endif
Run Code Online (Sandbox Code Playgroud)
__GLIBC__如果您正在使用gnu构建系统,则会定义.如果不编写小型测试程序,这可能是安全的.