免责声明:好久没接触C++了...

如今,为了提高可读性而修饰 C/C++ 函数/方法声明是否很常见?

粗略的例子:

void some_function(IN int param1, OUT char **param2);

与宏 出去 定义为 空的 身体(即轻量级文档(如果您愿意的话)。当然,我知道这与与方法/函数关联的“文档注释块”有些并行。

你能提供一些其他的例子吗...假设这个主题对社区有用。 请记住,上面的示例就是这样。

有帮助吗?

解决方案

我不会欣赏这样的装饰。

好多使用常量和参考文献和引用恒定,如在

void some_function(AClass const &param1, AnotherClass &param2)

一般的int通过值传递,而不是通过引用,所以我用ACLASS和AnotherClass用于示例。 在我看来,加入empy IN和OUT会分散注意力。

其他提示

Windows头实际上做正是这一点。请参见头注释获得的完整列表使用注解。例如,“

DWORD
WINAPI
GetModuleFileName(
    __in_opt HMODULE hModule,
    __out_ecount_part(nSize, return + 1) LPTSTR lpFilename,
    __in DWORD nSize
    );

有关该功能,hModule是一个可选的输入参数,lpFilename是存储最大nSize字符元件和其中将包含(该函数的返回值)返回时在它1层字符的元件,并且nSize一个输出参数是一种输入参数。

有关文档的目的,良好的书面意见块就足够了,所以这些不用于任何目的。此外,一些文档注释解析器必须为这样的事情特殊的语法;例如,给定的Doxygen的,你可以写:

/**
 * @param[in]  param1 ...
 * @param[out] param2 ...
 **/
void some_function(int param1, char **param2);

我觉得这是一个坏主意。特别是因为任何人都可以一起去,并定义宏IN / OUT,让你在一堆大麻烦。

如果你真的想记录它把意见在那里。

void some_function(/* IN */ int param1, /* OUT */ char **param2);

此外,为什么使用了当一回值将正常工作。结果 此外,我宁愿由参和const裁判用传球来表示我的意图。另外,编译器现在确实比较好optimsing的意图时,你的代码是const正确性。

void some_function(/* IN */ int const& param1, /* OUT */ char*& param2);
// OK for int const& is kind of silly but other types may be usefull.

不使用C ++,我没有做过C编程专业但至少在C ++中的参数的类型是不言自明的:

void f( std::string const & ); // input parameter
void f( std::string );         // input parameter again (by value)
void f( std::string& );        // in/out parameter
std::string f();               // output

这是在代码记录工具(doxygen的),您添加一些上下文参数(预期或功能,该功能不会怎么变的对象传入...

不可接受的什么值加在一起

关于指针:我们倾向于限制我们的方法接口原始指针。如果需要的话,他们可以使用,但一般智能指针应该是首选。再说,所有权语义来自智能指针的选择:shared_ptr的<>用于稀释分担责任(或需要时),auto_ptr的<> /的unique_ptr <>为单所有权(通常作为从工厂,当地人或构件属性返回值)。 ..

我尝试使用:

  • 输入参数或引用的值(如果它们很大)
  • 输出参数参考
  • 赋予被调用函数所有权的指针

大多数时候很容易看出哪些是 IN 或 OUT 参数,当然声明中的专有名称是一个很好的文档。

我发现那些 IN、OUT 插件很烦人。

我已经看到了这一点,但我不认为我会说这是“普遍的。”

在的Win32 API(C不是C ++)使用类似的东西:

WINADVAPI
BOOL
WINAPI
CreateProcessWithLogonW(
    __in        LPCWSTR lpUsername,
    __in_opt    LPCWSTR lpDomain,
    __in        LPCWSTR lpPassword,
    __in        DWORD dwLogonFlags,
    __in_opt    LPCWSTR lpApplicationName,
    __inout_opt LPWSTR lpCommandLine,
    __in        DWORD dwCreationFlags,
    __in_opt    LPVOID lpEnvironment,
    __in_opt    LPCWSTR lpCurrentDirectory,
    __in        LPSTARTUPINFOW lpStartupInfo,
    __out       LPPROCESS_INFORMATION lpProcessInformation
      );

在Visual C ++的2005和更高的编译器的情况下,这些实图像__$allowed_on_parameter声明和在编译时被检查。

差那么这样做的唯一的事情是看到前不久在由Pascal开发编写一个C程序:


#define begin {
#define end   }

int main( int argc, char* argv[] )
begin
  ...
end

我以前没有见过此。我认为这将是更好地把信息像这样的评论。

前缀的

我看到的使用I_,O_,io_除了信息在参数类型:

void some_function(int i_param1, char** o_param2, int& io_param3);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top