我有一个叫做var函数的全局变量foo.(我知道这是一个不好的做法,但有时它是不可避免的)我想知道C标准(我正在使用c99进行编译)说var如果我尝试执行会发生什么:
long foo(){
return var++;
}
Run Code Online (Sandbox Code Playgroud)
谢谢.
使用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之间匹配的所有内容用作错误消息.
我想__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) 假设我们有一个联合类型,它表示三个不同字符串值之一。
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) 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 子句有可能评估为真。
在写下这个问题的答案时: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) 前缀和后缀增量运算符的必要性是什么?还不够吗?
到目前为止,存在类似的while/do-while必要性问题,然而,将它们两者混淆(在理解和使用方面)并没有那么多.但同时具有前缀和后缀(如这些运算符的优先级,它们的关联,使用,工作).并且有没有人经历过你说过的情况"嘿,我将使用postfix增量.它在这里很有用."
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++ 中的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 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 ×7
assembly ×1
c++ ×1
c89 ×1
c99 ×1
clang ×1
cpu ×1
endianness ×1
errorformat ×1
gcc ×1
javascript ×1
null ×1
null-pointer ×1
pointers ×1
standards ×1
string ×1
typescript ×1
union-types ×1
vim ×1
x86 ×1