小编use*_*607的帖子

为什么是陈述(j ++); 禁止?

以下代码是错误的(在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:只能将赋值,调用,递增,递减,等待和新对象表达式用作语句

  1. 为什么在删除括号时编译代码?
  2. 为什么不用括号编译?
  3. 为什么C#这样设计?

c# syntax expression language-design parentheses

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

什么是callq指令?

我有一个由工具生成的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的文档,但找不到详细说明它支持的说明部分.

我理解它是对函数的调用,但我想知道细节.我在哪里可以找到它们?

x86 assembly x86-64 att

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

宏在linux内核中有一个不寻常的行?

我正在阅读这篇文章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 macros

9
推荐指数
0
解决办法
400
查看次数

使用Doxygen在另一个文件中插入功能链接?

我有两个C源文件.对函数的注释bar()在文件中A需要引用的函数foo()文件B.我怎样才能建立这个链接?

我试过了:

  1. 写一些类似的东西:B.c::foo()希望doxygen会转到文件B并在foo那里找到函数.

  2. 也试过简单,::foo()但没有帮助.

  3. 然后我尝试给文件B.c一个特殊的标记名,就像在//! @file specialtag第一行B.cspecialtag::foo(),然后在我的评论中做,但没有太多改变.

  4. 我试图迫使链路与\ref\link,但即使如此,也没有帮助.

//! @file行存在于两者中A.c,B.c因此doxygen应该知道代码.

编辑

我尝试了@doxygen的建议,但没有运气.我做了一个示例项目,以显示我遇到问题的地方,它在这里:http://www.filedropper.com/testdoxygen2tar

我使用了默认的安装文件doxygen -g.我得到的输出: Firefox显示由doxygen生成的页面

您可以看到foobar函数未链接到.

编辑2

发现了问题.功能foo没有记录,因此没有生成任何页面,所以当然doxygen没有链接到的页面.(我在SOURCE_BROWSER启用选项的情况下生成文档,并希望生成函数定义的链接)

c doxygen

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

c中零长度位字段的不同类型?

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 …

c bit-fields

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

glBufferData第二个arg是GLsizeiptr而不是GLsizei,为什么?

基本上就是这样,为什么glBufferData采用指针而不是int?这个arg应该是缓冲对象的大小,为什么不用GLsizei呢?

关于glBufferData的OpenGL文档https://www.opengl.org/sdk/docs/man/html/glBufferData.xhtml

opengl

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

GCC 如何阻止 ROM 中函数的隐式函数声明误报警告?

我想摆脱代码库中的所有隐式函数声明警告。但存在一个问题,因为某些函数在工厂时已编程到微控制器 ROM 中,并且在链接期间链接器脚本仅提供函数地址。这些函数由 SDK 中的代码调用。

在编译过程中,gcc 当然会发出警告implicit-function-declaration。我怎样才能摆脱这个警告?

需要明确的是,我理解为什么会出现警告以及它的含义。但在这种特殊情况下,SDK 的开发人员保证代码将按照隐式规则运行(即隐式函数仅接受 int 并返回 int)。所以这个警告是误报。

这只是 gnu-C-99,不是 c++。

想法:

  • 猜猜参数类型,在标题中写一个原型并包含它?
  • 告诉 gcc 使用某些 gcc 属性将此类函数视为误报?

c microcontroller gcc

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

我应该使用{}或{0}初始化数组/结构吗?

我有一个微弱的阅读记忆,int x[4] = {};用于将结构/数组初始化为默认值的代码依赖于最初出现在gcc中的非标准(但广泛)扩展,并且正确的版本(如标准中明确指出的)是int x[4] = { 0 };

它是否正确?

c initialization

4
推荐指数
1
解决办法
229
查看次数

指针的大小与printf的表示不同?

当我做

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个字节?

c pointers sizeof

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

if else块里面的字符串赋值?

这是未定义的行为吗?(因为字符串"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)

c undefined-behavior

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