Указание размера массива в выражении extern для команды sizeof - PullRequest
3 голосов
/ 20 января 2011

Был

char B[200];

в статической библиотеке. Это было упомянуто как

extern char B[];  // (1)

в заголовке, который включен в код клиента. Однажды мне нужно было использовать sizeof(B) компилятор пожаловался и изменил на

extern char B[200]; // (2)

успокоил компилятор.

Код библиотеки и клиента - c ++, но он использует связь C (внешние объявления заголовка, окруженные

extern "C" { ... }

Есть ли потенциальная проблема, если я использую (2) вместо (1)?

P.S. Я положил 200 для простоты. это константа, определенная в заголовочном файле, который поставляется вместе с библиотекой.

заголовок библиотеки:

#define MAXLEN 200

На самом деле, даже если это не библиотека, а отдельный файл (модуль компиляции), проблема аналогична.

Есть ли способ, которым (1) можно было бы использовать в этом большом старом коде, который я мог бы сломать с помощью (2)?

Ответы [ 2 ]

9 голосов
/ 20 января 2011

Если реализация библиотеки когда-либо изменит размер B, у вас будет несоответствие и, возможно, множество ошибок для поиска. Автор библиотеки должен предоставить константу, которая описывает размер массива. Как отмечено в комментарии, разработчик библиотеки может легко предоставить это через константу или функцию, написанную в терминах sizeof(b), чтобы сделать ее очень устойчивой к изменениям в библиотеке.

2 голосов
/ 17 января 2012

У меня была такая же проблема. эта статья объясняет это.

http://c -faq.com / Децл / extarraysize.html

вполне очевидно, но я не думал об этом раньше:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...