小编Lun*_*din的帖子

在C中使用后增量时返回变量

我有一个叫做var函数的全局变量foo.(我知道这是一个不好的做法,但有时它是不可避免的)我想知道C标准(我正在使用c99进行编译)说var如果我尝试执行会发生什么:

long foo(){
    return var++;
}
Run Code Online (Sandbox Code Playgroud)

谢谢.

c standards global-variables c99 language-lawyer

7
推荐指数
2
解决办法
3358
查看次数

Vim errorformat:在消息字符串中包含表达式的一部分

使用vim的errorformat语法,有没有办法在过滤结果时使用部分消息?

例如,除了错误本身之外,一些链接器错误没有任何明确的区别将它们区分为行上的错误:

/path/to/foo.cpp:42: undefined reference to 'UnimplementedFunction'
Run Code Online (Sandbox Code Playgroud)

要么

/path/to/foo.cpp:43: multiple definition of 'MultiplyDefinedFunction'
Run Code Online (Sandbox Code Playgroud)

使用错误格式:

set efm=%f:%l:\ %m
Run Code Online (Sandbox Code Playgroud)

会正确地捕获并显示这两个,但会错误地匹配许多其他情况(任何以"[string]:[number]:"开头的行).

或者,明确指定它们:

set efm=
set efm+=%f:%l:\ undefined\ reference\ to\ %m
set efm+=%f:%l:\ multiple\ definition\ of\ %m
Run Code Online (Sandbox Code Playgroud)

消除误报,但'消息'变得不那么有用 - 不再包含实际错误(只是在它之后的任何内容).


我缺少什么语法来处理这种情况?

理想情况下,我希望能够说出以下内容:

set efm+=%f:%l:\ %{StartMessage}undefined\ reference\ to\ %*\\S%{EndMessage}
set efm+=%f:%l:\ %{StartMessage}multiple\ definition\ of\ %*\\S%{EndMessage}
Run Code Online (Sandbox Code Playgroud)

...将StartMessage和EndMessage之间匹配的所有内容用作错误消息.

vim errorformat

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

如何正确使用“弱”?或C函数覆盖

我想__attribute__((weak))正确使用功能覆盖。

我的代码无法正常工作。它出什么问题了?


普通

#include <stdio.h>

int __attribute__((weak)) doJob1(void);
int __attribute__((weak)) doJob2(int, int);

typedef int (*Job1)(void);
typedef int (*Job2)(int, int);
Run Code Online (Sandbox Code Playgroud)

普通

#include <stdio.h>
#include "common.h"

__attribute__((weak)) int doJob1(void)
{
        printf("doJob1 common WEAK\n");
        return 0;
}

__attribute__((weak)) int doJob2(int a, int b)
{
        printf("doJob2 common WEAK\n");
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

驱动程序

#include <stdio.h>
#include "common.h"

int doJob1(void)
{
        printf("doJob1 driverA Strong\n");
}

void main()
{
        Job1 j1 = doJob1;
        Job2 j2 = doJob2;

        j1();
        j2(0, 0);
}
Run Code Online (Sandbox Code Playgroud)

运行程序时,我看到:

sh> ./a.out
doJob1 …
Run Code Online (Sandbox Code Playgroud)

c gcc

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

union类型的变量导致switch语句出错

假设我们有一个联合类型,它表示三个不同字符串值之一。

type Animal = 'bird' | 'cat' | 'dog';
Run Code Online (Sandbox Code Playgroud)

现在我想创建一只狗,并检查它是什么类型的动物,以产生它执行的正确噪音。

let oscar: Animal = 'dog';

switch (oscar) {
  case 'bird':
    console.log('tweet');
    break;
  case 'cat':
    console.log('meow');
    break;
  case 'dog':
    console.log('bark');
    break;
}
Run Code Online (Sandbox Code Playgroud)

此代码将导致 TypeScript 错误:(Type '"bird"' is not comparable to type '"dog"'.ts(2678)与 cat 类似)。但是,如果我对变量使用显式类型转换oscar,则它可以正常工作:

switch (oscar as Animal) {
  case 'bird':
    ...
  case 'cat':
    ...
  case 'dog':
    ...
}
Run Code Online (Sandbox Code Playgroud)

您能否向我解释一下,如果我使用显式值 for ,为什么前两个 switch 语句会失败oscar

如果我将 Oscar 声明为常量:const oscar = 'dog';,我可以理解该错误,因为在这种情况下,它始终是一只狗,而不是其他任何东西。然而,想象一下,如果巫师执行某个咒语,奥斯卡就会变成一只猫:

let oscar: Animal …
Run Code Online (Sandbox Code Playgroud)

javascript switch-statement typescript union-types

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

假设 NULL 常量为零是否安全?

Richard Reese所著的《理解和使用 C 指针》一书说:

空概念是空指针常量支持的抽象。这个常数可能是也可能不是一个常数零。AC 程序员不需要关心他们实际的内部表示。

我的问题是,由于“这个常数可能是也可能不是常数零”,我在我的代码中执行以下操作是否安全:

int *ptr = NULL;
// Some code which probably sets ptr to a valid memory address

if(!ptr)
{
   ERROR();
}
Run Code Online (Sandbox Code Playgroud)

如果 NULL 不为 0,则 if 子句有可能评估为真。

c null pointers null-pointer

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

clang 试图优化这个简单的递归算法是什么?

在写下这个问题的答案时:Using variable vs. using number我用 -O3 运行了 clang x86 9.0.0/trunk 以查看它是否可以对这个简单代码进行尾调用优化:

int faculty1 (const unsigned int n) {
    return n == 1 ? n : n * faculty1(n - 1);
}
Run Code Online (Sandbox Code Playgroud)

clang 不仅失败了,而且完全变成了香蕉并给了我这个:

神箭

.LCPI0_0:
        .long   0                       # 0x0
        .long   4294967295              # 0xffffffff
        .long   4294967294              # 0xfffffffe
        .long   4294967293              # 0xfffffffd
.LCPI0_1:
        .long   1                       # 0x1
        .long   1                       # 0x1
        .long   1                       # 0x1
        .long   1                       # 0x1
.LCPI0_2:
        .long   4294967292              # 0xfffffffc
        .long   4294967292              # 0xfffffffc
        .long …
Run Code Online (Sandbox Code Playgroud)

c x86 assembly clang

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

前缀和后缀运算符的必要性

前缀和后缀增量运算符的必要性是什么?还不够吗?

到目前为止,存在类似的while/do-while必要性问题,然而,将它们两者混淆(在理解和使用方面)并没有那么多.但同时具有前缀和后缀(如这些运算符的优先级,它们的关联,使用,工作).并且有没有人经历过你说过的情况"嘿,我将使用postfix增量.它在这里很有用."

c

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

联盟和字节序

typedef union status
{
    int nri;
    char cit[2];
}Status;

int main()  {
    Status s;
    s.nri = 1;
    printf("%d \n",s.nri);
    printf("%d,%d,\n",s.cit[0],s.cit[1]);
}
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

1
0,1
Run Code Online (Sandbox Code Playgroud)

我知道第二行的输出取决于CPU的结束.我怎么能在平台独立的程序中写这样的?有没有办法检查CPU的endianess?

c cpu endianness

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

在 C++ 中查找两个索引之间的子字符串

我想找到两个索引之间的子字符串。C++ 中的substr (start_index, number_of_characters) 函数根据字符数返回子字符串。因此,将它与开始和结束索引一起使用的小技巧如下:

 // extract 'go' from 'iamgoodhere'
 string s = "iamgoodhere";
 int start = 3, end = 4;
 cout<<s.substr(start,end-start+1); // go
Run Code Online (Sandbox Code Playgroud)

C++ 中还有哪些其他方法可以获取两个索引之间的子字符串?

c++ string

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

教程点的“C 模拟测试”是否正确?

由于我已经编码 C 20 多年了,我认为是时候参加考试了!看看我是否学到了任何东西,或者我是否只是一些欺诈行为,向互联网上的初学者发布免费但不正确的建议。

这个站点(我没有附属)提供免费的 C 测试。https://www.tutorialspoint.com/cprogramming/cprogramming_mock_test.htm

我参加了测试 1,但以 50 分中的 34 分惨败!是这个吗?我必须放弃我的 C 程序员职业吗?这个 Tutorialspoint 站点及其测试有多好?

具体来说,我未能用测试预期的答案回答 Q7、Q9、Q10、Q14、Q16、Q17、Q19、Q21、Q27、Q28、Q31、Q32、Q33、Q35、Q38、Q46。这些问题的正确答案是什么?

此外,当我在我的符合实现 C 编译器 ( gcc -std=c11 -pedantic-errors)上编译问题时,它们甚至都不会通过编译。这是为什么?我和/或我的编译器坏了吗?或者这个网站根本不是很好?

c c89

6
推荐指数
2
解决办法
212
查看次数