Nor*_*sey 31 c conditional-compilation
我尊重程序员表示,在C代码,#if
并且#ifdef
应当不惜一切代价避免,除了可能在头文件.为什么#ifdef
在.c文件中使用会被视为糟糕的编程习惯?
Ale*_*ski 55
很难维护.更好地使用接口来抽象平台特定代码,而不是通过散布#ifdef
整个实现来滥用条件编译.
例如
void foo() {
#ifdef WIN32
// do Windows stuff
#else
// do Posix stuff
#endif
// do general stuff
}
Run Code Online (Sandbox Code Playgroud)
不好.相反,有文件foo_w32.c
和foo_psx.c
与
foo_w32.c:
void foo() {
// windows implementation
}
Run Code Online (Sandbox Code Playgroud)
foo_psx.c:
void foo() {
// posix implementation
}
Run Code Online (Sandbox Code Playgroud)
foo.h中:
void foo(); // common interface
Run Code Online (Sandbox Code Playgroud)
然后有2个makefile 1 : Makefile.win
, Makefile.psx
每个编译相应的.c
文件并链接到正确的对象.
小修改:
如果foo()
的实现依赖于出现在所有平台上的一些代码,例如common_stuff()
2,只需拨打在您的foo()
实现.
例如
COMMON.H:
void common_stuff(); // May be implemented in common.c, or maybe has multiple
// implementations in common_{A, B, ...} for platforms
// { A, B, ... }. Irrelevant.
Run Code Online (Sandbox Code Playgroud)
foo_ {w32,psx} .c:
void foo() { // Win32/Posix implementation
// Stuff
...
if (bar) {
common_stuff();
}
}
Run Code Online (Sandbox Code Playgroud)
虽然您可能正在重复函数调用common_stuff()
,但您无法参数化foo()
每个平台的定义,除非它遵循非常特定的模式.通常,平台差异需要完全不同的实现,并且不遵循这样的模式.
make
,例如,如果您使用Visual Studio,CMake,Scons等.common_stuff()
实际上有多个实现,每个平台也不同.(有点问题)
我曾经看过一个提示,建议使用#if(n)def/#endif
块来调试/隔离代码而不是注释.
有人建议帮助避免被评论的部分已经有文件评论的情况,并且必须实施如下的解决方案:
/* <-- begin debug cmnt if (condition) /* comment */
/* <-- restart debug cmnt {
....
}
*/ <-- end debug cmnt
Run Code Online (Sandbox Code Playgroud)
相反,这将是:
#ifdef IS_DEBUGGED_SECTION_X
if (condition) /* comment */
{
....
}
#endif
Run Code Online (Sandbox Code Playgroud)
对我来说,这似乎是一个巧妙的想法.希望我能记住源,所以我可以链接它:(