假设我有多个函数可以实现相同的目标。一个例子是为数据类型创建“构造函数”。
String new_String();
String new_String(const char *cstr);
String new_String(String s);
Run Code Online (Sandbox Code Playgroud)
显然,这在 C 中无法实现,但是对于这样的函数(以及函数重载有用的情况),是否有命名它们的约定或最佳实践?
像这样的东西吗?
String new_String();
String new_String_c(const char *cstr);
String new_String_s(String s);
Run Code Online (Sandbox Code Playgroud)
对我来说,这感觉很尴尬并且不容易阅读。或者类似的东西?
String new_String();
String new_String_from_cstr(const char *str);
String new_String_copy(String s);
Run Code Online (Sandbox Code Playgroud)
这让我想起了可怕的长 java 名称,因为这很快就会变得荒谬。
int String_last_index_of_any_characters(String s, char *chars, int length);
Run Code Online (Sandbox Code Playgroud)
您可以定义一个带有 void * 初始化参数和枚举的“构造函数”:
enum StringCtor { SC_DEFAULT, SC_C_STR, SC_COPY };
String new_String(enum StringCtor type, const void *arg);
String s1 = new_String(SC_DEFAULT, 0);
String s2 = new_String(SC_C_STR, "hello");
String s3 = new_String(SC_COPY, &s2);
Run Code Online (Sandbox Code Playgroud)
您还可以选择使用 a...而不是void *。想法是相同的,但是va_*如果参数应该是字符串或副本,则可以使用宏来提取参数。
如果您只希望 API 具有单个构造函数的外观,但仍然希望类型安全,则可以使用上述技术来创建实际的构造函数实现,并使用内联函数和预处理器技巧来提供单个构造函数的外观,具有类型安全性。
String new_StringImpl(enum StringCtor type, const void *arg);
static inline String new_StringImplDefault () {
return new_StringImpl(SC_DEFAULT, 0);
}
static inline String new_StringImplCstr (const char *s) {
return new_StringImpl(SC_C_STR, s);
}
static inline String new_StringImplCopy (String *s) {
return new_StringImpl(SC_COPY, s);
}
#define new_String_Paste(TYPE) new_String_ ## TYPE
#define new_String_SC_DEFAULT(ARG) new_StringImplDefault()
#define new_String_SC_C_STR(ARG) new_StringImplCstr(ARG)
#define new_String_SC_COPY(ARG) new_StringImplCopy(ARG)
#define new_String(TYPE, ...) new_String_Paste(TYPE)(__VA_ARGS__)
String s1 = new_String(SC_DEFAULT);
String s2 = new_String(SC_C_STR, "hello");
String s3 = new_String(SC_COPY, &s2);
Run Code Online (Sandbox Code Playgroud)
请注意,使用可变参数宏,SC_DEFAULT不再需要第二个参数。在足够的优化级别下,代码将转换为仅对单个实现函数的调用,并具有编译时类型安全检查的优点。因此,您可以付出更多编码的代价,为库的用户提供单个构造函数 API 的外观,并具有多个构造函数的所有类型安全性。
| 归档时间: |
|
| 查看次数: |
1063 次 |
| 最近记录: |