LINUX.ORG.RU

си C99

 


2

1

Уважаемые форумчане. Что Вы думаете по поводу использования этого стандарта? Стоит ли его использовать? И использует ли кто либо вообще. Столкнулся с предупреждением вида:

warning: universal character names are only valid in C++ and C99 [enabled by default]
Это из за значения юникода (типа \u2663) в массиве char, обойти(сь) могу, не использовать. Но всё-таки?

★★★

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

Что Вы думаете по поводу использования этого стандарта?

спустя 15 лет, уже можно использовать

anonymous
()

Юникод же двухбайтовый (а то и больше), как его в массив char (1 байт на всех популярных архитектурах) запихнуть то? Разве что UTF-8, но с этим справляется любой текстовый редактор - в файл то сохранится уже готовая строка, а компилятору всё равно в какой кодировке текст в строковой константе - хоть в UTF-8, хоть в КОИ-8, хоть в Windows-1251.

KivApple ★★★★★
()

да, странно это, c99 все как-то перепрыгнули

unt1tled ★★★★
()

если не требуется поддержка MSVC — однозначно стоит.

(насчет vs2015 не уверен, может реализовали..)

с99 великолепная штука, и да, я пользуюсь.

waker ★★★★★
()

На С99 удобнее писать что ли. А по сути тот же С89, только вид с боку.

Cactus64k
()

Это из за значения юникода (типа \u2663) в массиве char

ну ты тупой, не? Char в x86 размером 1 байт, а твоё говно «♣» — 3 байта. Ну и как ты 3 байта в один затолкаешь?

Два решения:

1. wchar_t и постфикс L (не сработает в маздае, там wchar_t 16 бит, и этот символ не влезет)

2.

$ echo -e "\xE2\x99\xA3"
♣ # uses UTF-8

emulek
()

уже используют c11 в системных компонентах

anonymous
()

Использовать — стоит. Если у тебя уже есть готовый проект, и это — единственный варнинг, а, по твоим словам, ты можешь обойтись — обойдись.

Кстати, интересно. systemd компилится с -std=gnu99, однако там ничего С99-специфичного, вроде, нет.

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

Кстати, интересно. systemd компилится с -std=gnu99, однако там ничего С99-специфичного, вроде, нет.

Ну я открыл пару файлов первых попавшихся:

/* src/core/job.c @ 1226 */
static const char* const job_result_table[_JOB_RESULT_MAX] = {
    [JOB_DONE] = "done",
    [JOB_CANCELED] = "canceled",
    [JOB_TIMEOUT] = "timeout",
    [JOB_FAILED] = "failed",
    [JOB_DEPENDENCY] = "dependency",
    [JOB_SKIPPED] = "skipped",
    [JOB_INVALID] = "invalid",
    [JOB_ASSERT] = "assert",
    [JOB_UNSUPPORTED] = "unsupported",
};

/* src/core/manager.c @ 1518 */
struct iovec iovec = {
    .iov_base = buf,
    .iov_len = sizeof(buf)-1,
};
oh-la-la
()
Ответ на: комментарий от oh-la-la
[ecko@localhost develop]$ cat ctest.c
#include <stdio.h>

struct fst {
  int a;
  int b;
};

int main(void)
{
  struct fst f = {
    .a = 0,
    .b = 2,
  };
  printf("a=%d\tb=%d\n", f.a, f.b);
  return 0;
}
[ecko@localhost develop]$ gcc -o ctest ctest.c -Wall -std=c89
[ecko@localhost develop]$      

Что я сделал не так?

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

Всё так, просто здесь это расширение gcc:

$ gcc test.c -Wall -pedantic -std=c89
test.c: In function ‘main’:
test.c:11:9: warning: ISO C90 forbids specifying subobject to initialize [-Wpedantic]
         .a = 0,
         ^
test.c:12:9: warning: ISO C90 forbids specifying subobject to initialize [-Wpedantic]
         .b = 2,
         ^

oh-la-la
()
Ответ на: комментарий от oh-la-la

Ну-у-у-у, -pedantic — это другой разговор. pedantic и на такой код ругается.

[ecko@localhost develop]$ cat ctest2.c
#include <stdio.h>

int main(void)
{
  int a = 0;
  printf("%d\n", a);
  int b = 1;
  printf("%d\n", b);
  return 0;
}
[ecko@localhost develop]$ gcc -o ctest2 ctest2.c -std=c89 -pedantic
ctest2.c: В функции «main»:
ctest2.c:7:3: предупреждение: ISO C90 forbids mixed declarations and code [-Wpedantic]
   int b = 1;
   ^
[ecko@localhost develop]$

Но в целом — ясно. Спасибо!

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

С -std=gnu99 ругаться не будет. И на объявление итераторов внутри for — тоже.

У меня-то компиляются велосипеды с -W -Wall -Werror -Wextra!

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

Char в x86 размером 1 байт

чего это я вдруг тупой, вот массив:

char *card_symbols[] = {"\u2660","\u2663","\u2665","\u2666"};
так нельзя использовать? а c99 это массивы переменной длины и однострочные комментарии. Нашел примеры в интернете что люди не брезгуют всем этим, вот и назрел вопрос.

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

Я использую, потому что бесплатного драфта С11 после принятия стандарта ещё нет.

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

Ты описал массив указателей на char. Тебе уже сколько раз говорили, что если хочешь хрюникод, то пиши всякие извращения вроде wchar?

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

а c99 это массивы переменной длины и однострочные комментарии

Комментарии и раньше можно было. А за массивы переменной длины убиват надо!

Вот записи вроде for(int x = 0; x < y; x++) удобны, да. И еще, наверное, кое-какие плюшки есть, но я их не использую.

Eddy_Em ☆☆☆☆☆
()

Что Вы думаете по поводу использования этого стандарта? Стоит ли его использовать? И использует ли кто либо вообще.

Нет, вы что, сидите до конца жизни на C89. Вообще-то, все уже давно используют C11.

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

Я понял, но ещё раз скажу, что не с потолка это взял. Спасибо, заодно прояснилось что и динамические массивы зло.

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

У меня по дефолту стоит компиляция с ключем C11. Xcode. Да, используют и ещё как, c89 - прошлый век :)

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

C11 - тоже. Он не самостоятелен, это фактически отпрыск работы над C++11.

Да и вообще, какой смысл использовать очевидно устаревший си, когда есть кресты?

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

Да и вообще, какой смысл использовать очевидно устаревший си, когда есть кресты?

чтоб не тянуть libstdc++ например

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

это можно и на крестах с extern «C»

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

Тебе уже сколько раз говорили, что если хочешь хрюникод, то пиши всякие извращения вроде wchar?

Очень вредный совет, wchar не нужен вовсе.

Для работы с юникодом в си используется либо char, либо libunistring/libicu и т д.

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

Забавно, что оба твоих примера являются так же примером заимствования из C++. Казалось бы, почему просто не воспользоваться крестами сразу?

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

Потому, что сейчас уже есть D и Go. Я вместо extern C в крестах - лучше то же самое напишу в D. Язык грамотнее, проще, удобнее. Имхо, сейчас писать на крестах смысла нет. На Objective-C - есть, на Go - тоже. Кресты вообще ничем не привлекают. Даже Java 8 и то интереснее.

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

Модули для питона как и сам питон пишутся на си. Ковырять кресты с обёртками для этого мне ну совсем не интересно. По мне так уж лучше писать расширения для питона на Objective-C/Swift. И то прикольнее.

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

А ты подумай, чем плохи массивы на стеке.

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

D слишком маргинальный. Go слишком высокоуровневый из-за GC и сопутствующих вещей. Objective-C по сути язык под одну платформу. В общем ни один из них С++ полноценно заменить не может.

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

очевидно что он как бы намекает на подсчёт количества code point-ов чтобы показать всю боль UTF-8, однако, большинство программ обходятся тупой побайтовой длиной

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

Посчитать codepoint-ы — это тоже хрень:

size_t utf8_strcodepoints (const char* ptr)
{
    size_t ret = 0;
    while (*ptr) {
        if (*ptr < 0x80 || *ptr > 0xBF)
            ++ret;
        ++ptr;
    }
    return ret;
}

Всё дело в том, что подсчёт количества codepoint-ов, подсчёт количества знакомест и подсчёт количества байт — задачи совершенно разные. При этом первая (если подумать) не имеет практического смысла, вторая не имеет смысла для немоноширинных шрифтов, а третья выполняется обычным strlen-ом.

Отсюда и вопрос: а чего он, собственно, хочет получить?

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

При этом первая (если подумать) не имеет практического смысла

По моему как раз все кладут на композитные символы и нормализацию :)

Угадай в каких единицах измерения число 10

create table foo(bar varchar(10) primary key)

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