c-处理操作系统函数名称与宏不匹配



我当前的代码是:

int my_func(int a) 
{
#ifdef _WIN32
return _func(a);
#else
return func(a);
#endif
}

但我认为如果是这样的东西会更好:

#ifdef _WIN32
#define common_func(a) _func(a);
#else
#define common_func(a) func(a);
#endif
int my_func(int a) 
{
return common_func(a);
}

现在,我从来没有这样做过,我也不知道我在做什么。K&R cat((示例令人困惑。我基本上只是想把#ifdef从函数中取出来,因为它会变得太乱,因为我必须运行该函数好几次。

func()_func()是相同的函数,只是Windows认为在它前面加下划线是个好主意。所以它甚至不是一个宏函数,但可能更像是一个函数别名。还是包装纸?

这会影响性能吗?生成的代码与版本1不同吗?有什么诀窍吗,因为区别只是下划线?

我想正确而恰当地做这件事。请帮忙。

Windows认为在它前面加下划线是个好主意。所以它甚至不是一个宏函数,但可能更像是一个函数别名。还是包装纸?

很可能它只是一个具有相同规范的不同名称的函数。可能不是包装器或别名。与相应的fopen()fread()fwrite()不同,POSIXopen()read()write()等函数不是由C语言规范定义的。一般来说,C实现必须提供后一个组,因为它们没有义务提供前一个组。

这会影响性能吗?

条件编译指令(如#ifdef(在编译时求值。它们本身对运行时没有任何影响,而且在编译时非常便宜。

生成的代码与版本1不同吗?

否。这两个版本的代码是100%等效的。

有什么诀窍吗,因为区别只是下划线?

如果您想要使用几个函数,其中Windows版本与POSIX版本的名称(我想(有一个前导下划线,那么您可能认为值得定义一个可以对所有函数重用的通用宏,而不是为每个单独的函数滚动一个单独的东西。也许是这样的:

#ifdef _WIN32
#define POSIX_MANGLE(f) _ ## f
#else
#define POSIX_MANGLE(f) f
#endif

你会用这样的东西:

void do_something(int a) {
POSIX_MANGLE(func1)(a);
POSIX_MANGLE(func2)(a);
}

在Windows上(从技术上讲,无论在哪里定义_WIN32(,这相当于。。。

void do_something(int a) {
_func1(a);
_func2(a);
}

在其他任何地方,它都相当于。。。

void do_something(int a) {
func1(a);
func2(a);
}

最新更新