Re: Варнинг при gcc -std=gnu99. Помогите разбраться.
От: nah Россия  
Дата: 01.03.11 13:12
Оценка: 3 (1)
Здравствуйте, nah, Вы писали:

nah>...warning и я не понимаю его смысл.

nah>Так что же не нравится копилятору и как написать коректно?

Проблема решилась.

Оказывается:

1) Mac mac; //mac равен &mac (ну и, конечно всё равно указателя на первый элемент)
(операция & к имени массива не действует)

2) Компилятором трактуются по-разному "указатель на массив" и "указатель на указатель на элемент массива"
void f(const TMac* mac); НЕ то же самое что
void f(const unsigned char** mac);

Т.о. в моем случае надо писать
void f(const TMac mac);
вместо
void f(const TMac* mac);

На мой взгляд, такое поведение компилятора не очевидно, но логика в этом есть.

Здесь можно найти интересную информацию по теме.
http://stackoverflow.com/questions/1810083/c-pointers-pointi...

Здесь комментарий на эту тему от разработчика компилятора gcc.
http://gcc.gnu.org/ml/gcc-help/2009-12/msg00026.html

Всем спасибо
Варнинг при gcc -std=gnu99. Помогите разбраться.
От: nah Россия  
Дата: 01.03.11 08:03
Оценка:
Здрасти, всем.

Проект под Линукс, компилятор gcc.
Решил собирать проект с опцией -std=gnu99.
Все хорошо, но есть один warning и я не понимаю его смысл.

---<Код proba.c>----------------------------------------
#include <stdio.h>
typedef unsigned char TMac[6];
void f(const TMac* mac)
{
puts(mac?"mac":"no mac");
}
int main()
{
/*const*/ TMac mac;
f(&mac);
return 0;
}
---</Код proba.c>----------------------------------------

gcc -std=gnu99 -o q proba.c
proba.c: In function ‘main’:
proba.c:10: warning: passing argument 1 of ‘f’ from incompatible pointer type
proba.c:3: note: expected ‘const unsigned char (*)[6]’ but argument is of type ‘unsigned char (*)[6]’

Соответственно, если раскоментировать /*const*/ то варнинга не будет.

Так что же не нравится копилятору и как написать коректно?

Например, если функция ждет аргумент "const int*", а передается "int*", то все ОК и внутри функции аргумент будет указателем на константный инт.
Вроде, у меня ситуация аналогична.

Ещё раз, что же не нравится копилятору и как написать коректно?
Re: Варнинг при gcc -std=gnu99. Помогите разбраться.
От: aga1  
Дата: 01.03.11 11:18
Оценка:
Здравствуйте, nah, Вы писали:

[skip]
nah> typedef unsigned char TMac[6];
nah> int main()
nah> {
nah> /*const*/ TMac mac;
nah> f(&mac);
nah> return 0;
nah> }
nah> ---</Код proba.c>----------------------------------------

nah> Соответственно, если раскоментировать /*const*/ то варнинга не будет.


nah> Так что же не нравится копилятору и как написать коректно?


Напиши
 TMac const mac;
а то компилятору не очень понятно что у тебя за тип.
avalon 1.0rc3 rev 380, zlib 1.2.5
Re[2]: Варнинг при gcc -std=gnu99. Помогите разбраться.
От: aga1  
Дата: 01.03.11 11:43
Оценка:
Здравствуйте, aga1, Вы писали:

a> Напиши

a> TMac const mac;
a> а то компилятору не очень понятно что у тебя за тип.

Или сделай приведение типа аргумента функции к указателю на константу:

  f((TMac const *)&mac);
avalon 1.0rc3 rev 380, zlib 1.2.5
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.