以下代码是错误的(在ideone上看到它):
public class Test
{
public static void Main()
{
int j = 5;
(j++); // if we remove the "(" and ")" then this compiles fine.
}
}
Run Code Online (Sandbox Code Playgroud)
错误CS0201:只能将赋值,调用,递增,递减,等待和新对象表达式用作语句
我有一个由工具生成的x86_64架构的gnu汇编程序代码,并且有以下指令:
movq %rsp, %rbp
leaq str(%rip), %rdi
callq puts
movl $0, %eax
Run Code Online (Sandbox Code Playgroud)
我找不到关于"callq"指令的实际文档.
我查看了http://support.amd.com/TechDocs/24594.pdf,这是"AMD64架构程序员手册第3卷:通用和系统指令",但它们只描述了CALL近距离和远距离指令.
我查看了gnu汇编程序https://sourceware.org/binutils/docs/as/index.html的文档,但找不到详细说明它支持的说明部分.
我理解它是对函数的调用,但我想知道细节.我在哪里可以找到它们?
我正在阅读这篇文章http://www.ibm.com/developerworks/linux/library/l-gcc-hacks/,第一段代码就是这个,显然是从linux内核中获取的:
#define min(x, y) ({ \
typeof(x) _min1 = (x); \
typeof(y) _min2 = (y); \
(void) (&_min1 == &_min2); \
_min1 < _min2 ? _min1 : _min2; })
Run Code Online (Sandbox Code Playgroud)
现在为什么他们需要这(void) (&_min1 == &_min2);
条线?
我有两个C源文件.对函数的注释bar()
在文件中A
需要引用的函数foo()
文件B
.我怎样才能建立这个链接?
我试过了:
写一些类似的东西:B.c::foo()
希望doxygen会转到文件B
并在foo
那里找到函数.
也试过简单,::foo()
但没有帮助.
然后我尝试给文件B.c
一个特殊的标记名,就像在//! @file specialtag
第一行B.c
做specialtag::foo()
,然后在我的评论中做,但没有太多改变.
我试图迫使链路与\ref
和\link
,但即使如此,也没有帮助.
该//! @file
行存在于两者中A.c
,B.c
因此doxygen应该知道代码.
编辑
我尝试了@doxygen的建议,但没有运气.我做了一个示例项目,以显示我遇到问题的地方,它在这里:http://www.filedropper.com/testdoxygen2tar
我使用了默认的安装文件doxygen -g
.我得到的输出:
您可以看到foobar函数未链接到.
编辑2
发现了问题.功能foo
没有记录,因此没有生成任何页面,所以当然doxygen没有链接到的页面.(我在SOURCE_BROWSER
启用选项的情况下生成文档,并希望生成函数定义的链接)
Fount此语句零宽度位字段可以使下一个字段在下一个容器边界上对齐,其中容器的大小与位字段的基础类型相同
为了实现这一点,假设int是2个字节(16位),而short是1个字节(8位)以节省输入.另外,假设我们正在使用gcc编译器(很好地解释了与clang的差异).
struct foo {
unsigned int a:5;
unsigned int :0;
unsigned int b:3;
}
Run Code Online (Sandbox Code Playgroud)
在内存中,这看起来像
struct address
|
|
v
aaaaa000 00000000 bbb00000 00000000
Run Code Online (Sandbox Code Playgroud)
问题1:在我的理解它不会像aaaaa000 00000000 0..00bbb00000...
,所以bbb
必须与容器对准直接按照当前的容器.这是真的吗?
继续,如果我指定
struct bar {
unsigned short x:5;
unsigned int :0;
unsigned short y:7;
}
Run Code Online (Sandbox Code Playgroud)
会这样吗?
struct address
| short stops here short starts
| | |
v v | this is uint | v
xxxxx000 00000000 00000000 yyyyyyy0
Run Code Online (Sandbox Code Playgroud)
编辑1
有人指出短路不能少于16个字节.这与这个问题的观点略有不同.但是,如果对你很重要,你可以替换short
使用char …
基本上就是这样,为什么glBufferData采用指针而不是int?这个arg应该是缓冲对象的大小,为什么不用GLsizei呢?
关于glBufferData的OpenGL文档https://www.opengl.org/sdk/docs/man/html/glBufferData.xhtml
我想摆脱代码库中的所有隐式函数声明警告。但存在一个问题,因为某些函数在工厂时已编程到微控制器 ROM 中,并且在链接期间链接器脚本仅提供函数地址。这些函数由 SDK 中的代码调用。
在编译过程中,gcc 当然会发出警告implicit-function-declaration
。我怎样才能摆脱这个警告?
需要明确的是,我理解为什么会出现警告以及它的含义。但在这种特殊情况下,SDK 的开发人员保证代码将按照隐式规则运行(即隐式函数仅接受 int 并返回 int)。所以这个警告是误报。
这只是 gnu-C-99,不是 c++。
想法:
我有一个微弱的阅读记忆,int x[4] = {};
用于将结构/数组初始化为默认值的代码依赖于最初出现在gcc中的非标准(但广泛)扩展,并且正确的版本(如标准中明确指出的)是int x[4] = { 0 };
它是否正确?
当我做
int k = 9;
printf("sizeof k: %zu \n", sizeof (&k));
Run Code Online (Sandbox Code Playgroud)
我得到的大小8
.但是,当我这样做
printf("pointer to k: %p \n", &k);
Run Code Online (Sandbox Code Playgroud)
我得到0x7fff57e3ba24
.我可以看到这是12个十六进制数字,这意味着(因为1个十六进制是4位)指针占用48位,即6个字节.
问题:为什么sizeof打印8指针虽然只有6个字节?
这是未定义的行为吗?(因为字符串"True","False"和"Error"仅在块内退出并在退出块时被销毁):
char *p;
if (var1) {
p = "True";
} else if (var2) {
p = "False";
} else {
p = "Error";
}
printf("%s\n", p);
Run Code Online (Sandbox Code Playgroud)
我猜这同样适用于switch语句.那我怎么能表达上面的逻辑呢?
子问题:这也是未定义的行为吗?:
struct bar {
int i;
double d;
}
struct bar *barptr;
if (var1){
barptr = &(struct bar) { 0, 0.0 };
} else {
barptr = &(struct bar) { 5, 40.3 };
}
printf("%d", barptr->i);
Run Code Online (Sandbox Code Playgroud)