标签: c99

在Linux中奇怪地使用条件运算符

在3.0.4 Linux内核中,mm/filemap.c有这行代码:

retval = retval ?: desc.error;
Run Code Online (Sandbox Code Playgroud)

我已经尝试用gcc -Wall编译一个类似的最小测试用例,并且没有得到任何警告; 行为似乎与:

retval = retval ? retval : desc.error;
Run Code Online (Sandbox Code Playgroud)

看看C99标准,我无法弄清楚正式描述这种行为的原因.为什么这样好?

c linux gcc c99

37
推荐指数
3
解决办法
1850
查看次数

尽管使用相同的固定长度数据类型,C 程序在不同的机器上产生不同的结果

我在尝试 inttypes.h 时编写的简单程序:

#include <stdio.h>
#include <stdbool.h>
#include <inttypes.h>

bool get_bit(uint32_t x, uint8_t n) {
    x >>= n;
    return x & 1;
}

int main() {
    uint32_t x;
    uint8_t n;

    printf ("Enter x: ");
    scanf("%"SCNu32, &x);

    printf ("Enter n: ");
    scanf("%"SCNu8, &n);

    printf("The %"PRIu8"th bit of %"PRIu32" is: %d", n, x, get_bit(x, n));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在我的手机(64 位八核 ARN LTE Soc Android 10)上,它工作正常:

Enter x: 1
Enter n: 0
The 0th bit of 1 is: 1
Run Code Online (Sandbox Code Playgroud)

但在我的计算机(64 位 x86 Windows …

c windows mingw scanf c99

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

将多维可变长度数组传递给函数

有很多类似的问题,但我仍然找不到任何与C99/C11中可变长度数组特征相关的答案.

如何将多维可变长度数组传递给C99/C11中的函数?

例如:

void foo(int n, int arr[][]) // <-- error here, how to fix?
{
}

void bar(int n)
{
    int arr[n][n];
    foo(n, arr);
}
Run Code Online (Sandbox Code Playgroud)

编译器(g++-4.7 -std=gnu++11)说:
error: declaration of ‘arr’ as multidimensional array must have bounds for all dimensions except the first

如果我改成它int *arr[],编译器仍抱怨:
error: cannot convert ‘int (*)[(((sizetype)(((ssizetype)n) + -1)) + 1)]’ to ‘int**’ for argument ‘2’ to ‘void foo(int, int**)’

下一个问题,如何通过值传递它以及如何通过引用传递它?显然,通常你不希望在将它传递给函数时复制整个数组.

对于常量长度数组,它很简单,因为正如"常量"所暗示的那样,在声明函数时应该知道长度:

void foo2(int n, int arr[][10]) // <-- ok …
Run Code Online (Sandbox Code Playgroud)

c arrays c99

36
推荐指数
1
解决办法
3万
查看次数

C99内联函数在.c文件中

我在.c中定义了我的函数(没有头声明),如下所示:

inline int func(int i) {
 return i+1;
}
Run Code Online (Sandbox Code Playgroud)

然后在下面的同一个文件中我使用它:

...
i = func(i);
Run Code Online (Sandbox Code Playgroud)

在链接期间,我得到了"未定义的引用'func'".为什么?

c c99

36
推荐指数
2
解决办法
2万
查看次数

size_t的最大大小

我知道C返回类型的sizeof运算符是size_t在中定义的无符号整数类型<stdint.h>.这意味着它的最大尺寸应该65535在规定作为C99标准7.18.3:

limit of size_t
  SIZE_MAX             65535
Run Code Online (Sandbox Code Playgroud)

但是在gcc-4.8.2头文件stdint.h中定义的大小远远大于标准中所述的与下面所示的65535相矛盾的大小C99,

/* Limit of `size_t' type.  */
# if __WORDSIZE == 64
#  define SIZE_MAX              (18446744073709551615UL)
# else
#  define SIZE_MAX              (4294967295U)
# endif
Run Code Online (Sandbox Code Playgroud)

请帮助我理解为什么在我的误解背后存在差异或原因.

c gcc sizeof c99 size-t

36
推荐指数
1
解决办法
5万
查看次数

在C中使用`inline`关键字有什么用?

我在stackoverflow中读了几个关于inlineC的问题,但仍然不清楚.

  1. static inline void f(void) {}没有实际的区别static void f(void) {}.
  2. inline void f(void) {}在C中不能像C++那样工作.它在C中如何工作?
  3. 究竟做了extern inline void f(void);什么?

我从来没有真正inline在我的C程序中找到关键字的使用,当我在其他人的代码中看到这个关键字时,它几乎总是static inline,我认为没有区别static.

c inline c99

36
推荐指数
3
解决办法
3万
查看次数

MS Visual Studio编译器中提供了哪些C99功能?

这是众所周知,微软的Visual Studio编译器不支持C99,它看起来像他们有没有计划,以支持它.

但是,编译器确实包含一些樱桃挑选的功能,如可变参数宏和long long- 请参阅此答案中的引号:

在我们收到许多关于某些C99功能的请求的地方,我们已经尝试实现它们(或类似物).一对夫妇的例子是复杂的宏,long long,__pragma,__FUNCTION__,和__restrict.如果您在工作中发现其他C99功能,请告诉我们!我们没有从C用户那里听到太多,所以大声说出来并让自己听到

- Arjun Bijanki,微软在ISO C标准委员会的代表 http://blogs.msdn.com/b/vcblog/archive/2007/11/05/iso-c-standard-update.aspx

此外,较新版本的Visual Studio似乎附带了C99所需的一些标头.

关于特定功能有很多问题 - 但我不知道的是:在哪里可以找到当前MSVC编译器支持/提供的C99功能列表?

我正在为gcc寻找像这样的列表.

c compiler-construction c99 visual-studio

35
推荐指数
2
解决办法
1万
查看次数

字符数组的文字字符串初始值设定项

在以下规则中,当数组衰减到指针时:

左值[见2.5问题]型阵列的-T出现在表达衰变(有三个例外)转换成一个指向它的第一个元素的; 结果指针的类型是指向T的指针.

(例外情况是,当阵列是的sizeof或&运算符的操作数,或为字符数组一个文本字符串初始化.)

如何理解数组是"字符数组的文字字符串初始值设定项"的情况?请举个例子.

谢谢!

c arrays string pointers c99

34
推荐指数
3
解决办法
9740
查看次数

如何在C中返回匿名结构?

尝试一些代码我意识到以下代码编译:

struct { int x, y; } foo(void) {
}
Run Code Online (Sandbox Code Playgroud)

好像我们正在定义一个foo返回匿名的函数struct.

现在,我的问题是:它是否只发生在使用我的编译器编译或者这是合法的C(99)?如果是这样,return语句的正确语法是什么?如何正确地将返回值赋给变量?

c struct c99 return-type return-value

34
推荐指数
3
解决办法
7066
查看次数

如何在Eclipse中配置GCC以使用C99?

我正在Eclipse中开展一个小型C项目; 我刚刚从Ubuntu软件中心安装了Eclipse并添加了C/C++语言支持.我可以很好地构建,运行和调试简单的C程序.

但是我现在正在使用一些C99功能,而且Eclipse抱怨说"'''循环初始声明'只允许在C99模式下使用".

我以为你在makefile中为GCC设置了C99模式,但是makefile是由Eclipse自动生成的,所以我所做的任何更改都会被覆盖,但是我没有看到任何地方将GCC编译器选项放在Eclipse的首选项中,也没有项目属性窗口.

那么我在哪里定义C99模式?

eclipse gcc c99

33
推荐指数
1
解决办法
3万
查看次数