Как вы объявляете строковые константы в C?
Я знаю, что это довольно идиоматично, или хороший стиль, по крайней мере, в C, чтобы объявить числовые константы как enums вместо #defineing их.
/* bad style */
#define MAXLINE 1024
/* good/better style */
enum {
MAX_LINE = 1024
};
есть эквивалентное правило для определения строковых констант?
/* is this good style? */
#define HELLO "Hello World"
/* or is this better? */
const char *HELLO2 = "Howdy";
что вы предпочитаете? По возможности покажите некоторые недостатки любого метода.
4 ответа:
есть еще одна (по крайней мере) дорога в Рим:
static const char HELLO3[] = "Howdy";(
static- необязательно-это для предотвращения конфликта с другими файлами). Я бы предпочел этотconst char*, потому что тогда вы сможете использоватьsizeof(HELLO3)и поэтому вам не нужно откладывать до времени выполнения то, что вы можете сделать во время компиляции.определение имеет преимущество конкатенации времени компиляции, хотя (думаю
HELLO ", World!") иsizeof(HELLO)как хорошо.но тогда вы также можете предпочесть
const char*и использовать его в нескольких файлах, что позволит вам сэкономить немного памяти.короче - это зависит.
одно преимущество (хотя и очень небольшое) определения строки константы - это то, что вы можете объединить их:
#define HELLO "hello" #define WORLD "world" puts( HELLO WORLD );Не уверен, что это действительно преимущество, но это техника, которая не может быть использована с const char * ' s.
Если вы хотите "const string", как говорит ваш вопрос, я бы действительно пошел на версию, которую вы указали в своем вопросе:
/* first version */ const char *HELLO2 = "Howdy";в частности, я бы избегал:
/* second version */ const char HELLO2[] = "Howdy";причина: проблема со второй версией заключается в том, что компилятор сделает копию всей строки "Howdy", плюс эта строка может быть изменена (так что на самом деле не const).
С другой стороны, первая версия-это строка const, доступная указателем const HELLO2, и нет никакого способа любой может изменить его.