у нее есть дополнительный параметр,
Но лучше подобной неоднозначности избегать.
Стандартная функция strncpy() подобно strcpy() копирует строки, но у нее есть дополнительный параметр, задающий максимальное число копируемых символов.
То, что для инициализации объединения используются конструкторы, еще не гарантирует от случайных ошибок при работе с объединением, когда присваивается значение одного типа, а выбирается значение другого типа. Такую гарантию можно получить, если заключить объединение в класс, в котором будет отслеживаться тип заносимого значения :
class tok_val { public: enum Tag { I, D, S, N };
private: union { const char* p; char v[8]; long i; double d; };
Tag tag;
void check(Tag t) { if (tag != t) error(); } public: Tag get_tag() { return tag; }
tok_val(const char* pp); tok_val(long ii) { i = ii; tag = I; } tok_val(double dd) { d = dd; tag = D; }
long& ival() { check(I); return i; } double& fval() { check(D); return d; } const char*& sval() { check(S); return p; } char* id() { check(N); return v; } };
tok_val::tok_val(const char* pp) { if (strlen(pp) <= 8) { // короткая строка tag = N; strncpy(v,pp,8); } else { // длинная строка tag = S; p = pp; // записывается только указатель } }
Использовать класс tok_val можно так:
void f() { tok_val t1("короткая"); // присваивается v tok_val t2("длинная строка"); // присваивается p char s[8]; strncpy(s,t1.id(),8); // нормально strncpy(s,t2.id(),8); // check() выдаст ошибку }
Описав тип Tag и функцию get_tag() в общей части, мы гарантируем, что тип tok_val можно использовать как тип параметра. Таким образом, появляется надежная в смысле типов альтернатива описанию параметров с эллипсисом. Вот, например, описание функции обработки ошибок, которая может иметь один, два, или три параметра с типами char*, int или double:
extern tok_val no_arg;
void error( const char* format, tok_val a1 = no_arg, tok_val a2 = no_arg, tok_val a3 = no_arg);
Содержание Назад Вперед
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий