题
免责声明:好久没接触C++了...
如今,为了提高可读性而修饰 C/C++ 函数/方法声明是否很常见?
粗略的例子:
void some_function(IN int param1, OUT char **param2);
与宏 在 和 出去 定义为 空的 身体(即轻量级文档(如果您愿意的话)。当然,我知道这与与方法/函数关联的“文档注释块”有些并行。
你能提供一些其他的例子吗...假设这个主题对社区有用。 请 请记住,上面的示例就是这样。
解决方案
我不会欣赏这样的装饰。
好多使用常量和参考文献和引用恒定,如在
void some_function(AClass const ¶m1, AnotherClass ¶m2)
一般的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);