Я использую typedefs почти для всего, включая функции.В течение последних нескольких недель я настраивал наш код C ++, чтобы он как можно точнее соответствовал стандарту ISO C ++ 11, используя в качестве руководства окончательный проект документа (N3242).
Как мы знаемИногда в нашем коде появляются несколько объявлений, которые появляются в более чем одном файле во внешних файлах, или повторяющиеся определения типа.Согласно этому отрывку из раздела 7.1.3, стр. 145 вышеупомянутого документа, это должно быть безвредно:
3.В данной области, не относящейся к классу, спецификатор typedef может использоваться для переопределения имени любого типа, объявленного в этой области, для ссылки на тип, к которому он уже относится.
[Пример:
typedef struct s { /* ... */ } s;
typedef int I;
typedef int I;
typedef I I;
- конец примера]
Итак, я написал программу для проверки этого.В простейшем виде:
typedef int (fcntype)(int, int);
extern fcntype fcn1;
int fcn1(int x, int y) { return x + y; }
int main(int argc, char ** argv) { return fcn1(2, 3); }
Компиляция с использованием gcc с
-Wfatal-errors -Wswitch-default -Wswitch-enum -Wunused-parameter -Wfloat-equal -Wundef -c -Wstrict-null-sentinel -std=c++0x -pedantic -Wall -Wextra
, конечно, проблем не возникает.Давайте дублируем функцию decl:
typedef int (fcntype)(int, int);
extern fcntype fcn1;
extern fcntype fcn1; // woops. probably from an #include ...
int fcn1(int x, int y) { return x + y; }
int main(int argc, char ** argv) { return fcn1(2, 3); }
Как и предсказывает стандарт, проблем нет.Давайте сделаем другое изменение оригинала:
typedef int (fcntype)(int, int=0); // default param.
extern fcntype fcn1;
int fcn1(int x, int y) { return x + y; }
int main(int argc, char ** argv) { return fcn1(2); } // use the default param
Опять без проблем.Проблема возникает, когда у нас есть как дубликат decl, так и параметр по умолчанию, например:
typedef int (fcntype)(int, int=0); // default param.
extern fcntype fcn1;
extern fcntype fcn1; // FYI this is line 3 in the error message below.
int fcn1(int x, int y) { return x + y; }
int main(int argc, char ** argv) { return fcn1(2); } // use the default param
И gcc жалуется на
decltest.cpp:3: error: default argument given for parameter 2 of ‘int fcn1(int, int)’
Конечно, я очищаю кодкак это должно быть очищено, то есть я собираю файлы в один, лучше организованный файл.Но является ли это ошибкой в компиляторе или моим неправильным пониманием того, что параметр по умолчанию "is"?