LINUX.ORG.RU

$$ в C-коде

 ,


0

1

доброго дня, ЛОР! :)

смотрю примеры из MCUXpresso, но встретился с неизвестной мне конструкцией...
кто знает, что за фигня в «extern uint32_t Image$$RW_m_ncache$$Base[];»?

когда туда завезли «$$», и что это такое? %)

p.s. с виду похоже на какую-то новую фишку препроцессора...

★★★★★

Последнее исправление: metawishmaster (всего исправлений: 2)

просто имя переменной, в чем проблема? gcc вот такое пережевывает:

#include <string>
#include <iostream>

int main(int argc, char** argv) {
	std::string someStrange$$Var("hello");
	std::cout << someStrange$$Var << std::endl;
	return 0;
}
EugeneBas ★★
()

Это же название переменной.

fernandos ★★★
()

EugeneBas, fernandos, а я думал, что в именая переменных позволяются только [a..zA..Z0..9_]...
понял, спасибо большое!

metawishmaster ★★★★★
() автор топика

Просто gcc разрешает символ $ и всё. Удобно использовать когда тупедефаешь чтобы опустить struct

#include <stdio.h>

typedef struct dog
{
  char * say;
}$dog;

int main(int argc, char *argv[])
{
    $dog  pipa = {"Гав"};

    printf(" pipa say %s\n",pipa.say);
    return 0;
}
LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU


Удобно использовать когда тупедефаешь чтобы опустить struct


а мне «typedef struct dog { ... } dog_t;» как-то привычне...

metawishmaster ★★★★★
() автор топика
Последнее исправление: metawishmaster (всего исправлений: 1)
Ответ на: комментарий от metawishmaster

Веселей так:

typedef struct _x{
    struct _x *next;
    struct _x *prev;
    struct _x *first;
    struct _x *last;
    adata data;
} _;

_ *list = new_();
_ *tmp = new_();
addto_(list, tmp);

Я частенько в качестве временной переменной использую _:

register uint64_t _ = a;
a = b;
b = _;

Eddy_Em ☆☆☆☆☆
()

metawishmaster ★★★★ p.s. с виду похоже на какую-то новую фишку препроцессора…

😂😅

anonymous
()
Ответ на: комментарий от fsb4000

UB

Бред! УМВР!

cat 1.c; gcc 1.c && ./a.out 
#include <stdio.h>
#include <stdlib.h>

typedef struct _x{
        struct _x *next;
        int val;
} _;

int main(){
        _ _$_ = {NULL, -1}, *_p = &_$_;
        for(int __ = 0; __ < 5; ++__){
                _ *___ = calloc(1, sizeof(_));
                ___->val = __;
                _p->next = ___;
                _p = ___;
        }
        _p = &_$_;
        do{
                printf("val: %d\n", _p->val);
                _p = _p->next;
        }while(_p->next);
        return 0;
}
val: -1
val: 0
val: 1
val: 2
val: 3
Eddy_Em ☆☆☆☆☆
()
Последнее исправление: Eddy_Em (всего исправлений: 1)
Ответ на: комментарий от Eddy_Em

Бред! УМВР!

То, что у тебя работает, это далеко не показатель.

Ибо

7.1.3 Reserved identifiers

  • All identifiers that begin with an underscore and either an uppercase letter or another underscore are always reserved for any use, except those identifiers which are lexically identical to keywords.

  • All identifiers that begin with an underscore are always reserved for use as identifiers with file scope in both the ordinary and tag name spaces.

UB на то и UB, чтобы сломаться без предупреждения.

sjinks ★★★
()
Последнее исправление: sjinks (всего исправлений: 1)
Ответ на: комментарий от fsb4000

Ещё один

fsb4000 ★★★★★

А всеми здесь любимый MSVC так и вообще японские символы позволяет. Вы бы, товарищи, языки что ли с асма учили, а не с пхп. Не, ЛОР не умирает, он уже сдох)))

anonymous
()
Ответ на: комментарий от anonymous

пхп

Прекрасные чёткие правила именования переменных.

fernandos ★★★
()
Ответ на: комментарий от Eddy_Em

Никто никогда это не сломает.

Ну да, ну да. Разработчики ядра тоже так думали, а потом внезапно получили NULL pointer dereference.

sjinks ★★★
()
Ответ на: комментарий от fsb4000

так что номер драфта тоже лучше указывать…

У меня цитата из ISO/IEC 9899:2017

sjinks ★★★
()

краткий экскурс в застатую историю :-)

$ разрешённый символ в идентификаторах C - но с некоторыми ограничениями. Он назначен (измыслен) для препроцессоров, коих может быть более чем 1.

Программист используя ид. с $ должен отчётливо понимать все возможные последствия :-) Этот ид может быть переварен нестандартными препроцессорами и повлечёт гору…

В VMS лично застал, Dec-forms и встраиваемый SQL. С одной стороны очень удобно - всё пишется на C, но с нюансами. Зато формы рисуются визуально, и SQL в коде как родной.

эдакий DSL-ный прототип шаблонов и C++.

MKuznetsov ★★★★★
()
Последнее исправление: MKuznetsov (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU

в с++ пашет просто

struct{
  char * say;
}dog;

dog pipa{"Гав"};
anonymous
()
Ответ на: комментарий от Eddy_Em

в твоей гцце просто нет -Weverything

anonymous
()
Ответ на: комментарий от MKuznetsov

ясно :)
но, действительно, первый раз такое встретил сегодня...

metawishmaster ★★★★★
() автор топика

с виду похоже на какую-то новую фишку препроцессора

В С и C++ $ нельзя использовать. Это запрещено стандартом.

В gcc можно: https://gcc.gnu.org/onlinedocs/gcc/Dollar-Signs.html (даже там написано, что не для всех поддерживаемых таргетов, и что это расширение C)

Возможно ещё в каких-то компиляторах.

clang ловит это нарушение стандарта: https://gcc.godbolt.org/z/ToaMK3e9P

$ разрешённый символ в идентификаторах C

@MKuznetsov, нет.

fsb4000 ★★★★★
()
Последнее исправление: fsb4000 (всего исправлений: 3)
Ответ на: комментарий от metawishmaster

а у меня только что и clang-7.0.1-8+deb10u2 это проглотил

🤦 🤦 🤦 🤦

Ладно. Не буду больше настаивать. Пункты стандарта, где про это искать даны, документация gcc тоже. Если кто-то хочет, можете даже написать в багзиллу LLVM, что они неправы с -Wdollar-in-identifier-extension и -Wreserved-identifier там ваш баг закроют как «not a bug, won’t fix» но может хоть тогда поймёте что ошибаетесь.

fsb4000 ★★★★★
()
Ответ на: комментарий от fsb4000

да я просто спросил, шо за прикол - когда я читал про имена в С (в далёком 10-м классе), там было написано «[a..zA..Z0..9_]», и как я и думал, это оказалось фишкой gcc, которую поддерживают еще и clang7 вместе с MSVC12. Watcom'a под рукой нет, говорить за всех не буду.

metawishmaster ★★★★★
() автор топика
Ответ на: комментарий от fluorite

and either an uppercase letter or another underscore

И? Да, всякие __x и _X запрещены в качестве идентификаторов в принципе, но есть и второй пункт:

All identifiers that begin with an underscore are always reserved for use as identifiers with file scope in both the ordinary and tag name spaces.

который запрещает всякие там _x на уровне деклараций в file scope. Т.е. глобальная struct _x запрещена, а локальная переменная _i — нет.

sjinks ★★★
()
Ответ на: комментарий от unC0Rr

Ты вообще не понимашь, что такое UB.

Скорее всего, это не понимаешь именно ты. В Стандарте есть приложение, Annex J, в котором есть большой такой раздел под названием Undefined Behavior. И если ты таки осилишь его прочитать, то заметишь, что «The program declares or defines a reserved identifier, other than as allowed by 7.1.4 (7.1.3)» — это как раз-таки UB.

А ещё в разделе 3 Terms, Definitions, and Symbols можешь для себя раз и навсегда уяснить чёткое определение того, что такое Undefined Behavior и почему оно может встречаться не только во время выполнения программы, но и на этапе трансляции.

sjinks ★★★
()
Ответ на: комментарий от sjinks

Это вообще никаким боком не UB!!!

Скорей, это можно сравнить с использованием макросов, начинающихся с двух подчеркиваний: с высокой долей вероятности оно пролетит, но в определенной версии определенной библиотеки в заголовочном файле может попасться такой же макрос и — вуаля!

В любом случае, ты никогда не застрахован от этого. Скажем, назовешь переменную sinx, а в какой-то версии libm возьмут, да введут одноименную функцию.

И все это — пироги из одной и той же печи! Так что, можно смело обзывать переменные со знаком доллара и начинать их имена с подчеркивания (или вообще обзывать одним символом подчеркивания). Ничего страшного не будет, просто в определенный момент, возможно, придется чуть подрихтовать исходники. Но это всегда так: обновится библиотека, часть функций исчезнет — и приходится заново колупаться. У меня одна штука уже без половины функционала из-за подобного собирается, потому что лень мне лезть и переписывать все, чтобы GSL, leptonica и прочие говнолибы не использовать, у которых отсутствует поддержка старых функций (либо которые жутко тормозят, как в случае лептоники).

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от sjinks

Раз gcc позволяет подобные конструкции, то зачем париться, что кому-то в башку взбрело, что нельзя в глобальном пространстве имен использовать первое подчеркивание?

Eddy_Em ☆☆☆☆☆
()

Microsoft C++ ABI использует $ для манглинга имён.

X512 ★★★★★
()
Ответ на: комментарий от Eddy_Em

кому-то в башку взбрело, что нельзя в глобальном пространстве имен использовать первое подчеркивание?

Напомни ещё раз, ты не знаешь и ненавидишь С, но на лоре говоришь, что ты программируешь на С99, зачем? Пиши на языке, который тебе понравится. На том языке, где ты не будешь хейтить авторов языка. На том языке, который тебе захочется познать, изучить.

Гораздо приятнее писать на языке, который знаешь!

fsb4000 ★★★★★
()
Ответ на: комментарий от Eddy_Em

Я и пишу на С — вменяемом языке, где нет вообще никаких запретов кроме тех, что ты выдумываешь!

C99: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf

7.1.3  Reserved identifiers

All identifiers that begin with an underscore are always reserved for use as identifierswith file scope in both the ordinary and tag name spaces

Это было очень давно в С. Как видишь это было в С99.

Понятно. Пиши сразу, что ты пишешь на UBC. Не позорь С, никому не говори, что ты знаешь С или пишешь на С.

fsb4000 ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

ну хоть кто-то стандартов держался до последнего %)

metawishmaster ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Огонь ссылка, на час из жизни выбила. И либа прекрасна в своей хаковости, и гайд по лиспостроению неплох, хоть и крайне ограничен.

t184256 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.