<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: Варнинг при -std=gnu99. Помогите разбраться.</title>
    <link>https://www.opennet.me/openforum/vsluhforumID9/9052.html</link>
    <description>Здрасти, всем.&lt;br&gt;&lt;br&gt;Решил собирать проект с опцией -std=gnu99.&lt;br&gt;Все хорошо, но есть один warning и я не понимаю его смысл.&lt;br&gt;&lt;br&gt;---&amp;lt;Код proba.c&amp;gt;----------------------------------------&lt;br&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br&gt;typedef unsigned char TMac&#091;6&#093;;&lt;br&gt;void f(const TMac* mac)&lt;br&gt;&#123;&lt;br&gt;    puts(mac?&quot;mac&quot;:&quot;no mac&quot;);&lt;br&gt;&#125;   &lt;br&gt;int main()&lt;br&gt;&#123;&lt;br&gt;    /*const*/ TMac mac;&lt;br&gt;    f(&amp;mac);&lt;br&gt;    return 0;&lt;br&gt;&#125;&lt;br&gt;---&amp;lt;/Код proba.c&amp;gt;----------------------------------------&lt;br&gt;&lt;br&gt;gcc -std=gnu99 -o q proba.c &lt;br&gt;proba.c: In function &amp;#8216;main&amp;#8217;:&lt;br&gt;proba.c:10: warning: passing argument 1 of &amp;#8216;f&amp;#8217; from incompatible pointer type&lt;br&gt;proba.c:3: note: expected &amp;#8216;const unsigned char (*)&#091;6&#093;&amp;#8217; but argument is of type &amp;#8216;unsigned char (*)&#091;6&#093;&amp;#8217;&lt;br&gt;&lt;br&gt;Соответственно, если раскоментировать /*const*/ то варнинга не будет.&lt;br&gt;&lt;br&gt;Так что же не нравится копилятору и как написать коректно?&lt;br&gt;&lt;br&gt;Например, если функция ждет аргумент &quot;const int*&quot;, а передается &quot;int*&quot;, то все ОК и внутри функции аргумент будет указателем на константный инт.&lt;br&gt;Вроде, у меня ситуа</description>

<item>
    <title>Варнинг при -std=gnu99. Помогите разбраться. (pavlinux)</title>
    <link>https://www.opennet.me/openforum/vsluhforumID9/9052.html#11</link>
    <pubDate>Wed, 02 Mar 2011 22:42:18 GMT</pubDate>
    <description>&amp;gt; Ещё раз, что же не нравится копилятору и как написать коректно?&lt;br&gt;&lt;br&gt;&#091;code&#093;&lt;br&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br&gt;&lt;br&gt;typedef unsigned char (*TMac)&#091;6&#093;; /* ахтунг */ &lt;br&gt;&lt;br&gt;void f(const TMac * mac)&lt;br&gt;&#123;&lt;br&gt;        puts(mac ? &quot;mac&quot; : &quot;no mac&quot;);&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;int main()&lt;br&gt;&#123;&lt;br&gt;        TMac mac;&lt;br&gt;        f(&amp;mac);&lt;br&gt;        return 0;&lt;br&gt;&#125;&lt;br&gt;&#091;/code&#093;&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>Варнинг при -std=gnu99. Помогите разбраться. (pavlinux)</title>
    <link>https://www.opennet.me/openforum/vsluhforumID9/9052.html#10</link>
    <pubDate>Wed, 02 Mar 2011 22:13:59 GMT</pubDate>
    <description>&amp;gt;&amp;gt; Вот так?&lt;br&gt;&amp;gt;&amp;gt;  (Или я не понял что вы спрашиваете) &lt;br&gt;&amp;gt; Не подходит. Вариант с приведением типов уже предлагали выше.&lt;br&gt;&amp;gt; Проблема решилась.&lt;br&gt;&amp;gt; Оказывается: &lt;br&gt;&lt;br&gt;1.&lt;br&gt;        Большая часть путаницы вокруг указателей в С происходит от&lt;br&gt;        непонимания этого утверждения. &quot;Эквивалентность&quot; указателей и&lt;br&gt;        массивов не позволяет говорить не только об идентичности, но и&lt;br&gt;        взаимозаменяемости.&lt;br&gt;&lt;br&gt;&quot;Эквивалентность&quot; относится к следующему ключевому определению:&lt;br&gt;&lt;br&gt;значение типа массив-Т, которое появляется&lt;br&gt;в выражении, превращается (за исключением трех случаев)в&lt;br&gt;указатель на первый элемент массива; тип результирующего&lt;br&gt;указателя - указатель-на-Т.&lt;br&gt;&lt;br&gt;(Исключение составляют случаи, когда массив оказываетсяоперандом&lt;br&gt;        sizeof, оператора &amp; или инициализатором символьной строки для&lt;br&gt;        массива литер.)&lt;br&gt;&lt;br&gt;        Вследствие этого определения нет заметной разницы в поведении&lt;br&gt;        оператора индексирования &#091;&#093;, если его применять к массивам и&lt;br&gt;        указателям. Согласно правилу, приве</description>
</item>

<item>
    <title>Варнинг при -std=gnu99. Помогите разбраться. (Nah)</title>
    <link>https://www.opennet.me/openforum/vsluhforumID9/9052.html#9</link>
    <pubDate>Tue, 01 Mar 2011 13:11:11 GMT</pubDate>
    <description>&amp;gt; Вот так?&lt;br&gt;&amp;gt;  (Или я не понял что вы спрашиваете) &lt;br&gt;&lt;br&gt;Не подходит. Вариант с приведением типов уже предлагали выше.&lt;br&gt;&lt;br&gt;Проблема решилась.&lt;br&gt;&lt;br&gt;Оказывается:&lt;br&gt;&lt;br&gt;1) Mac mac; //mac равен &amp;mac (ну и, конечно всё равно указателя на первый элемент)&lt;br&gt;    (операция &amp; к имени массива не действует)&lt;br&gt;&lt;br&gt;2) Компилятором трактуются по-разному &quot;указатель на массив&quot; и &quot;указатель на указатель на элемент массива&quot;&lt;br&gt;    void f(const TMac* mac);  НЕ то же самое что&lt;br&gt;    void f(const unsigned char** mac);&lt;br&gt;&lt;br&gt;Т.о. в моем случае надо писать&lt;br&gt;void f(const TMac mac);&lt;br&gt;вместо&lt;br&gt;void f(const TMac* mac);&lt;br&gt;&lt;br&gt;На мой взгляд, такое поведение компилятора не очевидно, но логика в этом есть.&lt;br&gt;&lt;br&gt;Здесь можно найти интересную информацию по теме.&lt;br&gt;http://stackoverflow.com/questions/1810083/c-pointers-pointing-to-an-array-of-fixed-size&lt;br&gt;&lt;br&gt;Здесь комментарий на эту тему от разработчика компилятора gcc.&lt;br&gt;http://gcc.gnu.org/ml/gcc-help/2009-12/msg00026.html&lt;br&gt;&lt;br&gt;Всем спасибо ;-)&lt;br&gt;</description>
</item>

<item>
    <title>Варнинг при -std=gnu99. Помогите разбраться. (gpl77)</title>
    <link>https://www.opennet.me/openforum/vsluhforumID9/9052.html#8</link>
    <pubDate>Tue, 01 Mar 2011 11:26:29 GMT</pubDate>
    <description>&amp;gt;&amp;gt; Очевидно компилятор обрабатывает встроенные типы (int,double) и пользовательские по разному &lt;br&gt;&amp;gt; Звучит логично, но это не так.&lt;br&gt;&amp;gt; Если в примере выше TMac определить как структуру, то все ОК.&lt;br&gt;&amp;gt; Проблема именно с массивами (любыми массивами - интов, структур, указателей).&lt;br&gt;&amp;gt; Есть ещё у кого-нибудь варианты :-) &lt;br&gt;&lt;br&gt;Вот так?&lt;br&gt; (Или я не понял что вы спрашиваете)&lt;br&gt;&lt;br&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br&gt;typedef unsigned char TMac&#091;6&#093;;&lt;br&gt;void f(const TMac* mac)&lt;br&gt;&#123;&lt;br&gt;    puts(mac?&quot;mac&quot;:&quot;no mac&quot;);&lt;br&gt;&#125;&lt;br&gt;int main()&lt;br&gt;&#123;&lt;br&gt;    /*const*/ TMac mac;&lt;br&gt;    f((const TMac *) &amp;mac);&lt;br&gt;    return 0;&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>Варнинг при -std=gnu99. Помогите разбраться. (diff)</title>
    <link>https://www.opennet.me/openforum/vsluhforumID9/9052.html#7</link>
    <pubDate>Tue, 01 Mar 2011 09:02:55 GMT</pubDate>
    <description>&amp;gt;&amp;gt; Очевидно компилятор обрабатывает встроенные типы (int,double) и пользовательские по разному &lt;br&gt;&amp;gt; Звучит логично, но это не так.&lt;br&gt;&amp;gt; Если в примере выше TMac определить как структуру, то все ОК.&lt;br&gt;&amp;gt; Проблема именно с массивами (любыми массивами - интов, структур, указателей).&lt;br&gt;&amp;gt; Есть ещё у кого-нибудь варианты :-) &lt;br&gt;&lt;br&gt;Т.к. массивы передаются по указателю, очевидно, что компилятор требует чтобы значения были константными. (В отличие от встроенных типов которые итак копируются на стек, т.е. изменению не подлежат)&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>Варнинг при -std=gnu99. Помогите разбраться. (Nah)</title>
    <link>https://www.opennet.me/openforum/vsluhforumID9/9052.html#6</link>
    <pubDate>Tue, 01 Mar 2011 08:33:29 GMT</pubDate>
    <description>&amp;gt; Очевидно компилятор обрабатывает встроенные типы (int,double) и пользовательские по разному &lt;br&gt;&lt;br&gt;Звучит логично, но это не так.&lt;br&gt;Если в примере выше TMac определить как структуру, то все ОК.&lt;br&gt;Проблема именно с массивами (любыми массивами - интов, структур, указателей).&lt;br&gt;&lt;br&gt;Есть ещё у кого-нибудь варианты :-)&lt;br&gt; &lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>Варнинг при -std=gnu99. Помогите разбраться. (diff)</title>
    <link>https://www.opennet.me/openforum/vsluhforumID9/9052.html#5</link>
    <pubDate>Tue, 01 Mar 2011 08:13:06 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;&amp;gt; f((const TMac *)&amp;mac); &lt;br&gt;&amp;gt; Да, тогда варнинга не будет. Еще можно убрать const в функции. Да &lt;br&gt;&amp;gt; и на варнинг можно забить.&lt;br&gt;&amp;gt; Но, эти варианты не подходитят.&lt;br&gt;&amp;gt; Задача - разобраться что не нравится компилятору.&lt;br&gt;&amp;gt; На мой взгляд все понятно - ф-ии передается указатель на неконстантный массив, &lt;br&gt;&amp;gt; но функция ждет указатель на константный массив и поэтому внутри ф-ии &lt;br&gt;&amp;gt; массив будет константным и его изменять нельзя.&lt;br&gt;&amp;gt; Если вместо TMac подставить int, то компилятор считает именно так, а вот &lt;br&gt;&amp;gt; с массивом он не понимает.&lt;br&gt;&lt;br&gt;Очевидно компилятор обрабатывает встроенные типы (int,double) и пользовательские по разному&lt;br&gt;</description>
</item>

<item>
    <title>Варнинг при -std=gnu99. Помогите разбраться. (Nah)</title>
    <link>https://www.opennet.me/openforum/vsluhforumID9/9052.html#4</link>
    <pubDate>Tue, 01 Mar 2011 07:34:34 GMT</pubDate>
    <description>&amp;gt; Для С подойдет приведение типов при вызове: &lt;br&gt;&amp;gt; f((const TMac *)&amp;mac);&lt;br&gt;&lt;br&gt;Да, тогда варнинга не будет. Еще можно убрать const в функции. Да и на варнинг можно забить.&lt;br&gt;Но, эти варианты не подходитят.&lt;br&gt;&lt;br&gt;Задача - разобраться что не нравится компилятору.&lt;br&gt;&lt;br&gt;На мой взгляд все понятно - ф-ии передается указатель на неконстантный массив, но функция ждет указатель на константный массив и поэтому внутри ф-ии массив будет константным и его изменять нельзя.&lt;br&gt;&lt;br&gt;Если вместо TMac подставить int, то компилятор считает именно так, а вот с массивом он не понимает.&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>Варнинг при -std=gnu99. Помогите разбраться. (diff)</title>
    <link>https://www.opennet.me/openforum/vsluhforumID9/9052.html#3</link>
    <pubDate>Tue, 01 Mar 2011 07:04:49 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt; void f(const TMac* mac) &lt;br&gt;&amp;gt; &#123; &lt;br&gt;&amp;gt;     puts(mac?&quot;mac&quot;:&quot;no mac&quot;); &lt;br&gt;&amp;gt; &#125; &lt;br&gt;&amp;gt; int main() &lt;br&gt;&amp;gt; &#123; &lt;br&gt;&amp;gt;     /*const*/ TMac mac; &lt;br&gt;&amp;gt;     f(&amp;mac); &lt;br&gt;&amp;gt;     return 0; &lt;br&gt;&amp;gt; &#125; &lt;br&gt;&lt;br&gt;Для С подойдет приведение типов при вызове:&lt;br&gt;f((const TMac *)&amp;mac);&lt;br&gt;</description>
</item>

</channel>
</rss>
