在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标准,我无法弄清楚正式描述这种行为的原因.为什么这样好?
我在尝试 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 …
有很多类似的问题,但我仍然找不到任何与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中定义了我的函数(没有头声明),如下所示:
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返回类型的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)
请帮助我理解为什么在我的误解背后存在差异或原因.
我在stackoverflow中读了几个关于inlineC的问题,但仍然不清楚.
static inline void f(void) {}没有实际的区别static void f(void) {}.inline void f(void) {}在C中不能像C++那样工作.它在C中如何工作?extern inline void f(void);什么?我从来没有真正inline在我的C程序中找到关键字的使用,当我在其他人的代码中看到这个关键字时,它几乎总是static inline,我认为没有区别static.
这是众所周知,微软的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功能列表?
在以下规则中,当数组衰减到指针时:
左值[见2.5问题]型阵列的-T出现在表达衰变(有三个例外)转换成一个指向它的第一个元素的; 结果指针的类型是指向T的指针.
(例外情况是,当阵列是的sizeof或&运算符的操作数,或为字符数组一个文本字符串初始化.)
如何理解数组是"字符数组的文字字符串初始值设定项"的情况?请举个例子.
谢谢!
尝试一些代码我意识到以下代码编译:
struct { int x, y; } foo(void) {
}
Run Code Online (Sandbox Code Playgroud)
好像我们正在定义一个foo返回匿名的函数struct.
现在,我的问题是:它是否只发生在使用我的编译器编译或者这是合法的C(99)?如果是这样,return语句的正确语法是什么?如何正确地将返回值赋给变量?
我正在Eclipse中开展一个小型C项目; 我刚刚从Ubuntu软件中心安装了Eclipse并添加了C/C++语言支持.我可以很好地构建,运行和调试简单的C程序.
但是我现在正在使用一些C99功能,而且Eclipse抱怨说"'''循环初始声明'只允许在C99模式下使用".
我以为你在makefile中为GCC设置了C99模式,但是makefile是由Eclipse自动生成的,所以我所做的任何更改都会被覆盖,但是我没有看到任何地方将GCC编译器选项放在Eclipse的首选项中,也没有项目属性窗口.
那么我在哪里定义C99模式?