标签: c99

是否有保证至少两个字节的 C99 数据类型?

为了确定系统的字节顺序,我计划将多字节整数值存储在变量中,并通过;包装来访问第一个字节。例如:unsigned charunion

union{
    unsigned int val;
    unsigned char first_byte;
} test;

test.val = 1; /* stored in little-endian system as "0x01 0x00 0x00 0x00" */

if(test.first_byte == 1){
    printf("Little-endian system!");
}else{
    printf("Big-endian system!");
}
Run Code Online (Sandbox Code Playgroud)

我想让这个测试可以跨平台移植,但我不确定 C99 标准是否保证数据unsigned int类型的大小大于1 个字节。此外,由于“C 字节”在技术上不必是 8 位大小,因此我无法使用精确宽度的整数类型(例如uint8_tuint16_t等)。

C99 标准是否保证 C 数据类型的大小至少为两个字节?

PS假设 anunsigned int实际上大于一个字节,我的union行为是否会在所有 C99 兼容平台上按照我的预期(变量first_byte访问variable 中的第一个字节val)?

c memory types c99 endianness

1
推荐指数
1
解决办法
813
查看次数

标准 C 中是否需要文字后缀?

有一个问题已经回答了变量声明的特殊情况,但是其他文字常量的使用呢?

例如:

uint64_t a;
...
int32_t b = a / 1000000000;
Run Code Online (Sandbox Code Playgroud)

在任何标准 C 编译器中,最后一段代码是否等同于下一段代码?

uint64_t a;
...
int32_t b = (int32_t)(a / UINT64_C(1000000000));
Run Code Online (Sandbox Code Playgroud)

换句话说,是否需要 xINTn_C 宏(假设我们在隐式错误的情况下使用显式转换)?

编辑

当编译器读取 时1000000000,是否允许将其存储为int内部表示(删除所有溢出位),或者它必须以尽可能高的精度(long long)存储它,直到它解析整个表达式类型?它是实现定义的行为还是标准规定的?

c c99

1
推荐指数
1
解决办法
990
查看次数

为什么预定义宏 __STDC_VERSION__ 未定义?

我想知道我当前在 Visual Studio C++ 中使用哪个 C 标准,但我在使用__STDC_VERSION__预定义宏和其他 C99 预定义宏时遇到了问题 - 出现一条错误,表明该标识符未定义,当我使用时,#ifndef __STDC_VERSION__似乎它没有定义。这是否意味着我正在使用 ANSI C?

下面是使用的示例代码__STDC_VERSION__

int main(void) {
   printf("%d\n", __STDC_VERSION__);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

c c99 visual-c++

1
推荐指数
1
解决办法
4600
查看次数

GCC:对“__asan_init_v1”的未定义引用

我想用标志编译我的 C99 项目-fsanitize=address。我需要使用 CMake 并在 Centos 7 发行版上使用 gcc 进行编译。

我目前有gcc 7.3.1cmake 3.13.4

-fsanitize=address在编译标志列表和链接器中添加了标志,但它仍然无法编译并出现以下错误:

[ 6%] Building C object CMakeFiles/last.dir/src/ast/ast.c.o
[ 13%] Building C object CMakeFiles/last.dir/src/ast/ast_printer.c.o
[ 20%] Building C object CMakeFiles/last.dir/src/ast/cleaner.c.o
[ 26%] Linking C static library liblast.a
[ 26%] Built target last
[ 33%] Building C object CMakeFiles/lexecution.dir/src/execution/exec_parser.c.o
[ 40%] Building C object CMakeFiles/lexecution.dir/src/execution/exec_utils.c.o
[ 46%] Building C object CMakeFiles/lexecution.dir/src/execution/exec_func.c.o
[ 53%] Building C object CMakeFiles/lexecution.dir/src/execution/exec_parser_options.c.o
[ 60%] Linking C …
Run Code Online (Sandbox Code Playgroud)

gcc c99 cmake

1
推荐指数
1
解决办法
3214
查看次数

Const 结构与具有 Const 成员的结构

这两者有区别吗?

typedef struct {
    unsigned int day;
    unsigned int month;
    unsigned int year;
}birthday_t;

typedef struct {
    const birthday_t birthday;
    const unsigned int id;
}person_t;

person_t person = {
    .birthday = {1,20,2000},
    .id = 123};
Run Code Online (Sandbox Code Playgroud)

typedef struct {
    unsigned int day;
    unsigned int month;
    unsigned int year;
}birthday_t;

typedef struct {
    birthday_t birthday;
    unsigned int id;
}person_t;

const person_t person = {
    .birthday = {1,20,2000},
    .id = 123};
Run Code Online (Sandbox Code Playgroud)

如果结构内的成员是 const 但结构不是常量(顶部),这与没有 const 成员的 const 结构(底部)有什么不同?

c struct constants c99

1
推荐指数
1
解决办法
483
查看次数

在 C99 的 for 循环体之外声明计数器有什么好处吗?

我熟悉 C++,最近决定学习 C。我所关注的教程经常写这样的 for 循环:

int i;

for (i = 0; i < 5; i++)
{
    printf("%d", i);
}
Run Code Online (Sandbox Code Playgroud)

您可以看到计数器 (i) 是在 for 循环体之外声明的。在用 C(和 C++)编写时,我写:

for (int i = 0; i < 5; i++)
{
    printf("%d", i);
}
Run Code Online (Sandbox Code Playgroud)

我对此进行了一些研究,似乎后者在 C89 中是非法的,并且仅在 C99 中引入。但是,我使用的教程是基于 C99 的,而且我还看到了很多现代 C 代码,其中计数器仍然在 for 循环体之外声明。

因此,我要问的问题是:在 C99 中在 for 循环体之外声明计数器有什么实际好处吗?换句话说,我应该怎么写?

注意:我已经看到有“类似的问题”,但他们中的大多数人都在问为什么在某些代码中在 for 循环体之外声明计数器,而不是是否有任何好处。话虽如此,有一个类似的问题正在询问好处,但它是在 C++ 中,我不确定这两种语言在这方面是否存在差异。

c for-loop c99 c89

1
推荐指数
1
解决办法
108
查看次数

哪些版本的 C 允许您在 for 循环中声明变量?

自从我开始用 C 编码以来,我就被教导说

for(int i=0;i<10;++i)
...
Run Code Online (Sandbox Code Playgroud)

在 C++ 中工作,但在 C 中,您必须在 for 循环之外声明变量,如下所示:

int i;
for(i=0;i<10;++i)
...
Run Code Online (Sandbox Code Playgroud)

特别记得这是一个问题,因为当我开始用 C 编码时,我已经习惯了 C++ for 循环。

但是今天我正在阅读 2010 年 12 月的 C11 标准草案,它将 for 循环定义为

“for(子句1;表达式2;表达式3)语句”

在它的语法描述中,它指出:

“如果第 1 条是声明,则它声明的任何标识符的范围是声明的其余部分和整个循环”。

然后我做了一个测试并意识到我的 gcc(Debian 8.3.0)在 -std=c99 和 -std=c11 模式下以 C++ 风格编译 for 循环,即使使用 -Wall 标志也没有警告。

这是一个 gcc 扩展,还是 C 支持这种类型的循环有一段时间了,我只是没有注意到?

c gcc for-loop c99 c11

1
推荐指数
1
解决办法
90
查看次数

找出数组中最大的 n 个元素

我有一个数组,我需要在数组中找到 n 个并列案例,例如{1,2,3,3}我需要程序返回两个 3

void print_winner(void)
{
    // TODO
    string arr[9];
    string name = "";
    int largest = 0;
    for (int i = 0; i < voter_count; i++)
    {
        if (largest<candidates[i].votes)
        {
            largest = candidates[i].votes;
            name = candidates[i].name;
        }

    }

    // arr[0] = name;
    printf("%s\n", name);
    return;
}
Run Code Online (Sandbox Code Playgroud)

在这段代码中,候选人是一个具有两个属性的结构:名称和投票我需要该程序打印出票数最高的名称,即使有 3 路平局

我想我会遍历列表找到最大的 int 然后删除那个 int 并再次遍历列表以查看是否有任何元素等于原始列表中的最大元素,如果是,则将名称添加到数组中,最后打印所有名字)

c c99

1
推荐指数
1
解决办法
347
查看次数

如何在C中将size_t转换为int?

是否可以安全地将具有类型的变量转换为C99 中的size_t类型int

我很欣赏size_t未签名,但在我们需要int代表的情况下,我们能做什么?

c c99

1
推荐指数
1
解决办法
2592
查看次数

带有字符串的 C 行为中的 sizeof 运算符

对于sizeof运算符,我看到以下结果;我无法理解背后的原因。我的理解是sizeof运算符以size_t 的形式返回结果 下面是结果,

sizeof("6") -> 2
sizeof("a") -> 2
sizeof('a') -> 4
sizeof("something") -> 10
sizeof("some") -> 5
Run Code Online (Sandbox Code Playgroud)

c sizeof c99

1
推荐指数
1
解决办法
45
查看次数

标签 统计

c99 ×10

c ×9

for-loop ×2

gcc ×2

c11 ×1

c89 ×1

cmake ×1

constants ×1

endianness ×1

memory ×1

sizeof ×1

struct ×1

types ×1

visual-c++ ×1