Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Zla9_Kolu4ka
2 / 2 / 1
Регистрация: 28.08.2013
Сообщений: 409
1

Обязательно ли в extern указывать const?

22.08.2014, 01:44. Просмотров 991. Ответов 6
Метки нет (Все метки)

Почему, если так
main.c
C
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <stdlib.h>
 
void foo(void);
 
//char* str = "abc";
char const tmp_obj[] = "abc";   
char* str = &tmp_obj[0];//тут должно быть const char* str = &tmp_obj[0]
 
void main(void){
    foo();
    system("pause");
}
то warning C4090: инициализация: разные квалификаторы "const"


а если так
main.c
C
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <stdlib.h>
 
void foo(void);
 
//char* str = "abc";
char const tmp_obj[] = "abc";   
char* str = &tmp_obj[0];//тут должно быть const char* str = &tmp_obj[0]
 
void main(void){
    foo();
    system("pause");
}
temp.c
C
1
2
3
4
5
6
#include <stdio.h>
 
void foo(void){
    extern char* str;//тут должно быть extern const char* str;
    printf("%s  \n",str);
}
то нормально??
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.08.2014, 01:44
Ответы с готовыми решениями:

CONST_RETURN char *__cdecl strstr (const char *_Str, const char *_SubStr)
#include &lt;stdio.h&gt; #include &lt;string.h&gt; char tracks = { &quot;ya ostavil svoe...

extern
Всем привет, читал сейчас библиотеку SDL и там встретил такой вот код: ...

Extern и глобальные переменные
Здравствуйте! Есть вопрос по глобальным переменным, в частности нужно объявить...

использование extern в си на пример исходников squid
здравствуйте. из-за некоторых фактов я запутался: возьмём пример с английской...

Спецификатор extern для прототипов функций
accept, ну видимо хочет человек понять как разбивать сорц на единицы...

6
some_name
Вежливость-главное оружие
228 / 226 / 86
Регистрация: 19.02.2013
Сообщений: 1,441
22.08.2014, 02:07 2
Потому что вы в str записываете адрес &tmp_obj[0] стало быть сможете изменить данные по этому адресу, однако их менять нельзя т.к. tmp_obj объявлен как cont, поэтому, что бы обеспечить из сохранность, коспилятор требует и str объявить как cont, что бы гарантировать их целостность.
0
Zla9_Kolu4ka
2 / 2 / 1
Регистрация: 28.08.2013
Сообщений: 409
22.08.2014, 02:45  [ТС] 3
Потому что вы в str записываете адрес &tmp_obj[0] стало быть сможете изменить данные по этому адресу, однако их менять нельзя т.к. tmp_obj объявлен как cont, поэтому, что бы обеспечить из сохранность, коспилятор требует и str объявить как cont, что бы гарантировать их целостность.
понятно, спасибо, а так:
main.c
C
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <stdlib.h>
 
void foo(void);
 
//char* str = "abc";
char const tmp_obj[] = "abc";
const char* str = &tmp_obj[0];
 
void main(void){
    foo();
    system("pause");
}
temp.c
C
1
2
3
4
5
6
#include <stdio.h>
 
void foo(void){
    extern char* str;//тут должно быть const char* str
    printf("%s  \n",str);
}
почему нет ошибок??
0
some_name
Вежливость-главное оружие
228 / 226 / 86
Регистрация: 19.02.2013
Сообщений: 1,441
22.08.2014, 02:56 4
Цитата Сообщение от Zla9_Kolu4ka Посмотреть сообщение
почему нет ошибок??
а почему они должны быть?
Цитата Сообщение от Zla9_Kolu4ka Посмотреть сообщение
extern char* str;
указывает лишь на то, что в каком-то из файлов есть такая переменная и все
0
Zla9_Kolu4ka
2 / 2 / 1
Регистрация: 28.08.2013
Сообщений: 409
22.08.2014, 03:08  [ТС] 5
указывает лишь на то, что в каком-то из файлов есть такая переменная и все
а то что она с const это не считается??
мы же пишем, что она типа char*, почему мы не должны писать const?
0
some_name
Вежливость-главное оружие
228 / 226 / 86
Регистрация: 19.02.2013
Сообщений: 1,441
22.08.2014, 03:13 6
Цитата Сообщение от Zla9_Kolu4ka Посмотреть сообщение
а то что она с const это не считается??
мы же пишем, что она типа char*, почему мы не должны писать const?
It's because const implies internal linkage by default, so your "definition" isn't visible outside of the translation unit where it appears.

Т.е. const работает в пределах файла, в котором определн, а за его пределами он не действует. Я так мыслю.
0
Zla9_Kolu4ka
2 / 2 / 1
Регистрация: 28.08.2013
Сообщений: 409
22.08.2014, 03:22  [ТС] 7
Т.е. const работает в пределах файла, в котором определн, а за его пределами он не действует. Я так мыслю.
в externe мы обЪявляем для того чтобы линковщик мог у себя в таблицах или где он там ищет точно опознать переменную, для этого нужно имя и тип(потому что может быть 2 переменных с одним именем и разным типом), а квалификатор не обязателен, я так мыслю
0
22.08.2014, 03:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.08.2014, 03:22

Обязательно ли указывать type атрибут в тегах
audio/video

Обязательно ли указывать все время родителей для GUI элементов?
Добрый день, интересует такой вопрос, обязательно ли указывать все время...

Обязательно ли в c# напротив каждого поля или метода указывать его модификатор доступа?
Например у меня несколько public полей, тогда обязательно ли для каждого писать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru