【问题标题】:#Define Entire function call with arguments?#定义带参数的整个函数调用?
【发布时间】:2013-03-02 18:10:31
【问题描述】:

我有一个程序在两个不同的编译器上运行,每个编译器都有一个不同的文件处理库。例如关于库需要:

fwrite(buffer,size,elements,file)

而另一个是:

f_write(file,buffer,size,elements)

我是否可以在 #ifdef 语句内的主头文件中使用全局 #define 来允许我在编译器之间无缝转换?

【问题讨论】:

  • f_write 哈哈,那是从哪里开始的

标签: c function call c-preprocessor


【解决方案1】:

当然:

#ifdef STUPID_COMPILER
# define fwrite(ptr, size, nitems, stream) f_write(stream, ptr, size, nitems)
#endif

然后在你的代码中使用fwrite()——不需要包装函数。如果您正在使用需要它的编译器/库,预处理器会将其转换为 f_write() 调用。

【讨论】:

  • 也许“其他”编译器没有提供标准实现,因此名称不同?不一定愚蠢,但明显不同?顺便说一句,我认为您提供的答案是这样做的“正确”方法。
【解决方案2】:

你可以创建一个新函数:

size_t my_fwrite(...)
{
#ifdef REAL_FWRITE
    return fwrite(buffer,size,elements,file);
#elif  F_WRITE
    return f_write(file,buffer,size,elements);
#else
    #error "No fwrite"      
#endif
}

什么样的实现不提供fwrite但有f_write

【讨论】:

  • 是的,这是最好的方法,因为它将#define 封装在一个地方。
  • 我在 FAT 文件系统实现中看到了这一点。此代码的用户应提供一些粘合宏来将标准调用转换为特定的文件系统实现。这适用于在默认编译器实现中没有提供文件系统实现的嵌入式系统。
  • @cnicutar,没问题。 1下来,Inf - 1去,然后我们甚至:-)
猜你喜欢
  • 2013-08-19
  • 2015-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-13
  • 1970-01-01
  • 2019-11-19
相关资源
最近更新 更多