2015-11-16 4 views
0

У меня есть разделяемая библиотека, которая принимает новую строку (для оболочки) в качестве параметра argv[1] я также глобального переменного быстрого строку типа как таковогоназначения Строки имеет неполную тип

char *prompt[]; 

int setprompt(int argc, char *argv[]) { 
    prompt = argv[1]; 
    return 0; 
} 

, и я получаю следующая ошибка

setprompt.c:14:2: error: ‘prompt’ has an incomplete type

prompt = argv[1];

^

+3

Если 'prompt' должен указывать на строку приглашения, то его тип должен быть' 'символ *, а не' (char *) [] '. В любом случае последний действительно является неполным, потому что он не указывает количество элементов в массиве ('char *'). –

ответ

0

Он должен быть объявлен как указатель:

char *prompt; 

Thi s аргумент, переданный функции char *argv[], представляет собой массив указателей, и вы назначаете вашему глобальному указателю только один элемент из этого массива.

1

В коде

char *prompt[]; 

вы не снабжали размер для массива.

Цитирование C11, глава §6.7.6.2

If the size is not present, the array type is an incomplete type. [...]

Только время вы позволили сделать это, когда вы указываете список инициализации, в противном случае, вы должны указать размер явно.

По вашему требованию достаточно сделать prompt a char *.

+0

IIRC также разрешен как последний элемент данных структуры. – juanchopanza

+0

@juanchopanza абсолютно сэр, но это должно быть членом 'struct'. Тем не менее, это будет неполный тип, не так ли? Пожалуйста, поправьте меня, если я ошибаюсь. –

+0

@SouravGhosh, вы абсолютно правы. Стандарт фактически ставит его именно в таких терминах: «В качестве особого случая последний элемент структуры с более чем одним именованным элементом может иметь неполный тип массива, который называется гибким членом массива». (C2011, 6.7.2.1/18) –

1

Вы не можете объявить глобальный или локальный с этим синтаксисом, так как он обозначает массив неопределенного размера. Такое объявление является прекрасным как параметр функции, так как массив распадается на указатель.

В вашем случае, вы хотите указатель, а не массив указателей:

char *prompt; 
Смежные вопросы