Вот еще один способ сделать это. Предполагая, что у вас есть отсортированный список для начала, и вам не нужно делать просеивание на месте, мы можем просто выбрать самые длинные строки за один проход:
string_list = sorted(string_list)
sieved = []
for i in range(len(string_list) - 1):
if string_list[i] not in string_list[i+1]:
sieved.append(string_list[i])
Нет, это не обязательно, это просто делает код более понятным в отношении того, что именно передается в функцию.
Вам не нужно делать это с некоторыми исключениями, так как вы можете получить предупреждение, если объект, на который вы указываете функцию, - volatile
или const
- обычно имеет другой атрибут.
void ee(void *q)
{
pritntf("%p", q);
}
volatile int g;
const int f;
int main()
{
ee(&g);
ee(&f);
}
дает это предупреждение:
<source>: In function 'main':
<source>:17:8: warning: passing argument 1 of 'ee' discards 'volatile' qualifier from pointer target type [-Wdiscarded-qualifiers]
ee(&g);
^~
<source>:6:15: note: expected 'void *' but argument is of type 'volatile int *'
void ee(void *q)
~~~~~~^
<source>:18:8: warning: passing argument 1 of 'ee' discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
ee(&f);
^~
<source>:6:15: note: expected 'void *' but argument is of type 'const int *'
void ee(void *q)
~~~~~~^
Compiler returned: 0
Указатель на любой тип может быть свободно преобразован в или из void *
без приведения.
Раздел 6.3.2.3p1 стандарта C гласит:
Указатель на void может быть преобразован в или из указателя на любой тип объекта. Указатель на любой тип объекта может быть преобразован в указатель на void и обратно; результат должен сравниться с исходным указателем.
blockquote>Единственный раз, когда требуется приведение, - это если вы передаете указатель на переменную функцию, такую как
printf
, где неявное преобразование не может произойти, поскольку оно не будет знать, какой именно тип передается в есть.Обратите внимание, что, как и с любым типом указателя, вы не можете «удалить» квалификатор, такой как
const
, при передаче функции без приведения. Разделы 6.3.2.3p2 гласят:Для любого квалификатора q указатель на тип, не квалифицированный q , может быть преобразован в указатель на q -квалифицированная версия типа; значения, сохраненные в исходном и преобразованном указателях, должны сравниваться равными.
BLOCKQUOTE>