【问题标题】:simple inquiry about variable modifiers in CC中变量修饰符的简单查询
【发布时间】:2014-03-26 11:16:24
【问题描述】:

我一直认为我对 C 足够了解,但我一直不确定这两者是否按标准等效:

/* ========= */

const int i;
const int j;

/* as opposed to */

const int i, j;

/* ========= */

每当我只需要修改几个变量时,我都会使用第一种表示法。我知道这些对 GCC 和 MSVC 都有效,但没有读过古老的“K&R”,我不知道这是否符合标准。

【问题讨论】:

  • 完全一样。
  • 编码风格不是比标准更重要吗?
  • 在这里问可能更快,但它教给你的东西比你自己找出答案要少得多。您不需要获取 K&R 的副本来执行此操作(尽管它可能是可搜索的),只需将两个简单的源代码编译为汇编,然后查看编译器的更改(这很简单,因为没有任何实质内容会有所不同)。
  • @Mauren:一旦你知道这个问题的答案,是的。在此之前,不一定。
  • 询问可能会更快,但如果不进行自己的研究,这样做仍然是不礼貌的。 默认情况下,您的便利不应以牺牲我们的利益为代价。

标签: c coding-style standards


【解决方案1】:

是的,如下:

const int i;
const int j;

等价于

const int i, j;

但是,如果它们是指向 int 的指针,那么

const int* i, j;

不等于:

const int* i;
const int* j;

但后两个声明等价于:

const int *i, *j;

【讨论】:

  • 也许这意味着将“*”附加到变量名而不是其类型是更好的做法,例如int *i 而不是 int* i。使上述问题更易于阅读和理解?
  • @Hiett 是的,或者可能创建 typedef。
  • 说我注意到 K&R 使用 int* i 而不是 int *i 所以我是谁来争论 ;-)
  • 我一直在使用int *i,而 K&R 从来没有来困扰我 ;)
  • @Hiett K&R 作为风格指南完全没有价值。为什么要向恐龙咨询如何编写现代程序?当恐龙在地球上漫游时,既没有发明适当的编程风格,也没有发明适当的程序设计。
【解决方案2】:

可以通过编译一个简单的测试并查看汇编输出来确定这些表达式是等价的。

main()
{
    const int i=1;
    const int j=2;
}

gcc test.c -S -o output.s -O0

main()
{
    const int i=1, j=2;
}

两者的输出是相同的,看起来像这样。 (我添加的评论)。

main:
    #Set up the stack frame
    pushl   %ebp
    movl    %esp, %ebp

    #Make room on the stack for 2 local variables
    subl    $16, %esp

    #Assign the literal value of 1 to the first local variable
    movl    $1, -4(%ebp)

    #Assign the literal value of 2 to the second local variable
    movl    $2, -8(%ebp)

    leave

如果您对没有提及“const”感到疑惑,这是因为 const 只是 C 语言中的高级构造。

【讨论】:

  • 但是如果你有int* i; int* j;int* i, j;,反汇编不一定显示出任何差异,以防指针和整数大小相同。
  • 这只是一个语法错误。我认为问题的重点在于int i; int j;int i, j;int *i; int *j;int *i, *j; 之间的字面区别,这就是我的答案所针对的。
  • 我只是在编写一些宏,通过可变参数声明传递给它的任意数量的变量。我提供了一个“修饰符”参数,然后我实际上开始想知道它会对作为可变参数传递的所有其他变量名产生什么影响。
  • 是的,确实是这个问题。我的观点是,我认为大会并不能证明什么。
  • 它不能证明你的 C 语法是正确的 C 语法没有。它可以证明生成的机器码做同样的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-11
  • 2019-09-03
  • 1970-01-01
  • 2020-07-15
  • 1970-01-01
  • 2012-08-26
相关资源
最近更新 更多