相关疑难解决方法(0)

尾随逗号和C++

我已经阅读过C++标准不允许的内容enum an_enum { a, b, c, };,而C的后期版本(我认为从90年代中期开始)确实允许使用尾随逗号进行此类声明.如果C++应该与C具有向后兼容性,那么为什么禁止使用此功能呢?任何特殊原因?

我还读到这样的尾随逗号实际上是好的,所以这只会增加混乱.

c c++

34
推荐指数
2
解决办法
9067
查看次数

是否需要C enum中的最后一个逗号?

C enum声明中是否需要最后一个逗号?

即是VAL3必要后的逗号?

enum { Val1, Val2, Val3, } someEnum;
Run Code Online (Sandbox Code Playgroud)

将其留入/取出是否有任何副作用

谢谢

c syntax enums

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

编程语言语法中尾随逗号的历史

许多编程语言允许在列表中的最后一项之后的语法中使用尾随逗号.据说这是为了简化自动代码生成,这是可以理解的.

例如,以下是Java中完全合法的数组初始化(JLS 10.6数组初始化器):

int[] a = { 1, 2, 3, };
Run Code Online (Sandbox Code Playgroud)

我很好奇是否有人知道哪种语言首先允许使用这些尾随逗号.显然C 早在1985年便有它.

此外,如果有人知道现代编程语言的其他语法"特性",我也会非常有兴趣听到这些语言.我读到例如Perl和Python在语法的其他部分允许使用尾随逗号更加自由.

language-agnostic syntax grammar language-design

17
推荐指数
1
解决办法
5354
查看次数

为什么许多程序员将逗号移到下一行?

请告诉我,下面这种风格的神圣力量是什么:

var javascript = new Language(
  'Brendan Eich'
, new Date(1995, 0, 1)
, ['C', 'Java', 'Scheme']
);
Run Code Online (Sandbox Code Playgroud)

为什么许多程序员使用这种风格?它有什么好处?例如,

var javascript = new Language(
  'Brendan Eich',
  new Date(1995, 0, 1),
  ['C', 'Java', 'Scheme']
);
Run Code Online (Sandbox Code Playgroud)

我比以前更喜欢.谢谢.

javascript

16
推荐指数
4
解决办法
4622
查看次数

如何将整数初始化为"a = {1,}"编译?

我发现这个奇怪的语法:

int a = {1,};
Run Code Online (Sandbox Code Playgroud)

它适用于我尝试过的所有编译器.它是如何编译的?

编辑:我认为标量初始化器只能有一个元素,产生我的问题.对不起,所有的烦恼.

c++ syntax c++11

15
推荐指数
1
解决办法
777
查看次数

C++语法的两个好奇心

§5.2[expr.post]/1中,我们有了expression-list的定义

expression-list:
     initializer-list

为什么我们需要这两个定义?

§8.5[dcl.init]/1中,我们有:

braced-init-list:
     {initializer-list,opt }
     {}

为什么我们需要,上面的可选项?

请注意,此代码段编译:

struct A{
    int i;
    float f;
    A(int i, float f) : i(i), f(f) {}
};

int main()
{
    A a = { 1, 2., };
}
Run Code Online (Sandbox Code Playgroud)

c++ grammar language-lawyer c++14

13
推荐指数
2
解决办法
1304
查看次数

Actionscript:为什么可以在声明变量之前分配变量?

灵感来自问题int [] = {1,2,}; 奇怪的逗号允许.任何特殊原因?我记得有关Adobe的Actionscript语法的问题.

出于某种原因,可以(至少在Flex 3中)在声明变量之前为变量赋值:

 public function foo() : void {
      a = 3;
      var a : int = 0;
 }
Run Code Online (Sandbox Code Playgroud)

这有意义吗..?这是Adobe FlexBuilder编译器中的错误吗?或者这可能是因为旧款Ecmascript版本的遗留问题?

apache-flex flash flexbuilder actionscript actionscript-3

11
推荐指数
1
解决办法
300
查看次数

为什么这个c#片段合法?

愚蠢的问题,但为什么以下行编译?

int[] i = new int[] {1,};
Run Code Online (Sandbox Code Playgroud)

如你所见,我没有进入第二个元素并在那里留下逗号.即使你不期望它仍然编译.

c# grammar

9
推荐指数
5
解决办法
467
查看次数

不可恢复的块范围错误,C++仿函数数组

我正在尝试在编译时创建一个仿函数数组,如下所示:(完整文件):

#include <functional>
using namespace std;

function< float( float tElevation, float pAzimuth )> colorFunctions[] = {
  []( float tElevation, float pAzimuth ) -> float {
    return 2.0f ;
  },
} ;

int main()
{
}
Run Code Online (Sandbox Code Playgroud)

这很好.但是只要你尝试在仿函数块中创建一个局部,就像这样:

function< float( float tElevation, float pAzimuth )> colorFunctions[] = {
  []( float tElevation, float pAzimuth ) -> float {
    float v = 2.0f ;
    return v ;
  },
} ;
Run Code Online (Sandbox Code Playgroud)

您收到错误1错误C1506:不可恢复的块范围错误

如何在这些块中声明本地?它似乎不起作用.

c++ arrays lambda functor c++11

5
推荐指数
1
解决办法
1202
查看次数

数组初始化C.

这个初始化是什么意思:

char arr[10] = { 0, };
Run Code Online (Sandbox Code Playgroud)

我很熟悉char arr[10] = {0};将所有元素设置为零,并将char arr[10] = {1,2};前两个元素设置为1和2(ascii),其余元素设置为0.我不熟悉上面的格式.快速测试显示它可能就像char arr[10] = {0};,但还有其他含义我不知道吗?

c arrays

3
推荐指数
2
解决办法
6035
查看次数

在编译时生成BitCount LUT

假设我需要为0 ... 255值创建一个包含预先计算的位计数值(数字中的1位数)的LUT:

int CB_LUT[256] = {0, 1, 1, 2, ... 7, 8};
Run Code Online (Sandbox Code Playgroud)

如果我不想使用硬编码值,我可以使用漂亮的模板解决方案如何计算32位整数中的设置位数?

template <int BITS>
int CountBits(int val) 
{
    return (val & 0x1) + CountBits<BITS-1>(val >> 1);
}

template<>
int CountBits<1>(int val) 
{
    return val & 0x1;
}

int CB_LUT[256] = {CountBits<8>(0), CountBits<8>(1) ... CountBits<8>(255)}; 
Run Code Online (Sandbox Code Playgroud)

该数组在编译时完全计算.有没有办法避免长列表,并使用某种模板甚至宏生成这样的数组(抱歉!),如:

Generate(CB_LUT, 0, 255);  // array declaration
...
cout << CB_LUT[255];       // should print 8
Run Code Online (Sandbox Code Playgroud)

笔记.这个问题不是关于计算一个数字中的1位,而是仅用作示例.我想在代码中完全生成这样的数组,而不使用外部代码生成器.必须在编译时生成数组.

编辑.为了克服编译器限制,我找到了以下解决方案,基于Bartek Banachewicz代码:

#define MACRO(z,n,text) CountBits<8>(n)
int CB_LUT[] = {
    BOOST_PP_ENUM(128, MACRO, _)
};
#undef …
Run Code Online (Sandbox Code Playgroud)

c++ templates boost boost-preprocessor

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

在c中初始化数组的格式为`int a [3] = {0,};`

我看过一个数组初始化的源代码是int arr[3] ={0,};什么意思?我通常使用这种格式int arr[3]={0};我可以知道有什么区别

c linux systems-programming

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