小编Jen*_*edt的帖子

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万
查看次数

sig_atomic_t实际上如何工作?

编译器或操作系统如何区分sig_atomic_t类型和普通的int类型变量,并确保操作是原子的?使用两者的程序具有相同的汇编代码.如何特别注意使操作成为原子?

c linux signals

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

我可以在printf中传递一个预期整数的字符吗?

以下代码是否正确?

char mychar = 200;
printf("%x", mychar);
Run Code Online (Sandbox Code Playgroud)

根据http://www.cplusplus.com/reference/clibrary/cstdio/printf/ %x期望一个整数(我的编译器为4个字节),我在这里只传递1个字节.由于printf使用了varargs,我担心这只会因为堆栈上的字节对齐而起作用(即,当在堆栈上按下时,char总是使用4个字节).

我认为最好写一下:

char mychar = 200;
printf("%x", static_cast<int>(mychar));
Run Code Online (Sandbox Code Playgroud)

你认为第一个代码是否安全?如果没有,如果我切换到bigendian架构,你认为我能得到不同的输出吗?

c c++ variadic-functions

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

表达式中的问号运算符

K&R第二版(第71页) - 我一定错过了解释:

sign = (s[i] == '-') ? -1 : 1;
Run Code Online (Sandbox Code Playgroud)

这个上下文是一个将字符串转换为double的函数.这部分特别是在功能跳过空白区域之后.我推断它正在检查正值或负值,并在函数结束时将其保存为-1或+1以进行符号转换...return sign * val /power;

我想这样做不是更好推断......我是特别不确定什么?: 1正在做的事情(或任何地方,对于这个问题).

这看起来像是一个抽象的if陈述.当?检查真理,:else......是这样吗?它仅限于if/else

我是初学者,之前我没有遇到过这种表达式语法,所以我想知道是否有一个特殊的原因它似乎经常被正式的if/else替代 - 也许,可读性?

c operators

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

usleep()在C中实现为忙等待吗?

我正在构建一个多线程应用程序,pthreads需要一个线程来定期检查一些东西.在此线程之间的时间内不应使用任何CPU.这有可能usleep()吗?是usleep()不是在忙着等待?或者有更好的解决方案吗?

c posix

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

写或打印,哪个更快?

完成以下测试后:

for( i = 0; i < 3000000; i++ ) {
    printf( "Test string\n" );
}

for( i = 0; i < 3000000; i++ ) {
    write( STDOUT_FILENO, "Test string\n", strlen( "Test string\n" ) );
}
Run Code Online (Sandbox Code Playgroud)

事实证明,对printf的调用总共需要3秒钟,而写入调用需要花费46秒.如何,所有花哨的格式化魔法printf,以及它printf本身所称的事实,write这可能吗?有什么东西我不见了吗?

任何和所有的想法和意见都表示赞赏.

c unix io performance system-calls

12
推荐指数
2
解决办法
8252
查看次数

可以抛弃constness导致未定义的行为?

const int a = 10
int *p = (int*) &a;
*p = 20;
printf("a = %d", a);
Run Code Online (Sandbox Code Playgroud)

是否可以输出10或20,具体取决于编译器?

c casting const

12
推荐指数
4
解决办法
566
查看次数

如何在C中找到除法的余数?

找出两个数字的除法是否会返回余数的最佳方法是哪一种?我们举个例子,我有一个值为{3,5,7,8,9,17,19}的数组.现在我需要从上面的数组中找到51的完美除数.有没有更简单的方法来解决这个问题?

c division

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

`({...})`如何返回一个值?

我最近发现了这个GCC宏:

#define max(a,b) \
   ({ typeof (a) _a = (a); \
       typeof (b) _b = (b); \
     _a > _b ? _a : _b; })
Run Code Online (Sandbox Code Playgroud)

在我看到这段代码之前我没有意识到,一段代码{...}可以某种方式在C中返回值
.1)你能给我一个暗示它是如何工作的吗?

虽然,我通常可以通过滥用逗号运算符来实现相同的结果:

#define max(a,b) \
    (typeof (a) _a = (a), \
     typeof (b) _b = (b), \
     (_a > _b ? _a : _b)) 
Run Code Online (Sandbox Code Playgroud)

或者如果只是为了副作用,我会使用 do { ... } while(0)

2)这样做的首选方式是什么?

c gcc

11
推荐指数
2
解决办法
397
查看次数

在C中,我可以在指针声明中初始化字符串,就像我可以在char数组声明中初始化字符串一样吗?

这两行代码是否实现了相同的结果?如果我在函数中有这些行,那么在两种情况下字符串都存储在堆栈中吗?除了不需要在第一行代码中声明空终止符之外,我是否应该使用一个而不是另一个?

char  s[] = "string";
char* s   = "string\0";
Run Code Online (Sandbox Code Playgroud)

c arrays pointers c-strings

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