Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中使用变量而不是`#define`来指定数组大小是否不好+;?(C错误:在文件范围内进行了可变修改)_C++_C_Arrays_Compiler Errors_Static Initialization - Fatal编程技术网

C++ 在C+中使用变量而不是`#define`来指定数组大小是否不好+;?(C错误:在文件范围内进行了可变修改)

C++ 在C+中使用变量而不是`#define`来指定数组大小是否不好+;?(C错误:在文件范围内进行了可变修改),c++,c,arrays,compiler-errors,static-initialization,C++,C,Arrays,Compiler Errors,Static Initialization,在C语言中,不允许使用变量声明数组大小,即使它是const变量。例:这无法在C中编译: #include <stdio.h> const int SIZE = 2; int a[SIZE]; int main() { a[0] = 1; a[1] = 2; printf("%i, %i", a[0], a[1]); return 0; } 在C++中,它运行得很好。 输出: $gcc -o main *.c main.c:5:5:

在C语言中,不允许使用变量声明数组大小,即使它是
const
变量。例:这无法在C中编译:

#include <stdio.h>

const int SIZE = 2;
int a[SIZE];

int main()
{
    a[0] = 1;
    a[1] = 2;
    printf("%i, %i", a[0], a[1]);       
    return 0;
}
在C++中,它运行得很好。

输出:

$gcc -o main *.c
main.c:5:5: error: variably modified ‘a’ at file scope
 int a[SIZE];
     ^
$g++ -o main *.cpp
$main
1, 2
要使其在C中运行,必须使用
#define
而不是变量。即:

这在C或C++中运行良好:

#include <stdio.h>

#define SIZE 2
// const int SIZE = 2;
int a[SIZE];

int main()
{
    a[0] = 1;
    a[1] = 2;
    printf("%i, %i", a[0], a[1]);
    return 0;
}
#包括
#定义大小2
//常数int SIZE=2;
int a[大小];
int main()
{
a[0]=1;
a[1]=2;
printf(“%i,%i”,a[0],a[1]);
返回0;
}

<>所以,在C++中,我几乎总是使用变量,而不是<代码>定义> <代码>,来声明数组的大小。我只是将数组大小变量
设置为const
,一切都很好!然而,最近我开始用纯C语言编写很多微控制器程序,当我遇到这个错误并解决了这个问题时,一位高级开发人员告诉我,使用
#定义
-ed常量(或者硬编码的数字)以外的任何东西来声明数组大小都是不好的做法

这是真的吗?在指定数组大小时,C++中的坏习惯是使用<代码> const <代码>变量而不是<代码>定义< /代码>吗?如果是,原因是什么?

在C语言中,显然你被
#define
:你别无选择。但是在C++中,你显然至少有2个选择,所以一个比另一个好吗?<强>使用另一个有风险吗? 相关的:

  • 因为
    SIZE
    被定义为
    const
    变量。在C中,与C++ <代码> const 不同,值不是<强>真常量。它们存储在内存中,可以间接引用和修改(通过修改内存中的内容)。这就是为什么,在C++中,有<代码> const <代码>,允许<代码> const int=2;
    可以工作,但在C中,即使是
    const
    也不够

    C11-§6.7.9/3:

    要初始化的实体类型应为未知类型的数组 大小或不是可变长度数组的完整对象类型 类型。

    在编译时替换预处理器宏,这就是它工作正常的原因


    参考链接:

    因为
    SIZE
    被定义为
    const
    变量。在C中,与C++ <代码> const 不同,值不是<强>真常量。它们存储在内存中,可以间接引用和修改(通过修改内存中的内容)。这就是为什么,在C++中,有<代码> const <代码>,允许<代码> const int=2;
    可以工作,但在C中,即使是
    const
    也不够

    C11-§6.7.9/3:

    要初始化的实体类型应为未知类型的数组 大小或不是可变长度数组的完整对象类型 类型。

    在编译时替换预处理器宏,这就是它工作正常的原因


    参考链接:

    在这件事上最好听从斯科特·迈耶的建议。从他的书《有效的C++》中:
    第2项:首选常量、枚举和内联线而不是#定义。

    适用于您的示例的项目摘要

    此项最好称为“首选编译器而非预处理器” 因为
    #define
    可能被视为不属于语言的一部分 就其本身而言。这是它的问题之一

    当你这样做的时候

    #define SIZE 2
    
    编译器可能永远看不到符号名
    SIZE
    ;信息技术 可能在源代码获取之前被预处理器删除 编译程序。因此,可能无法输入名称
    SIZE
    进入符号表。如果在测试过程中出现错误,这可能会令人困惑 编译涉及使用常量,因为错误消息 可能指的是
    2
    ,而不是
    SIZE
    。如果
    尺寸
    为
    定义在一个头文件中,你不知道它在哪里
    
    2
    来自,你会浪费时间追踪它。这个问题 也可能出现在符号调试器中,因为名称 您正在使用的编程可能不在符号表中。 解决方案是用常量替换宏:
    const double SIZE=2;//大写名称通常用于宏,因此名称更改

    作为一个语言常量,
    SIZE
    肯定会被编译器和 肯定会被输入到他们的符号表中

    ✦ 对于简单常量,更喜欢常量对象或枚举而不是#定义。
    ✦ 对于类似于宏的函数,更喜欢内联函数而不是#定义

    另请参阅“第3项:尽可能使用常量”,了解有关其用法和用法例外的更多信息

    因此,要回答标题中的问题:

    <强>><强> >,在C++中使用变量而不是<代码> >定义< /代码>不是一个坏的做法。p> 在这件事上,最好听从斯科特·迈耶的建议。从他的书《有效的C++》中:
    第2项:首选常量、枚举和内联线而不是#定义。

    适用于您的示例的项目摘要

    此项最好称为“首选编译器而非预处理器” 因为
    #define
    可能被视为不属于语言的一部分 就其本身而言。这是它的问题之一

    当你这样做的时候

    #define SIZE 2
    
    编译器可能永远看不到符号名
    SIZE
    ;信息技术 可能在源代码获取之前被预处理器删除 编译程序。因此,可能无法输入名称
    SIZE
    进入符号表。如果在测试过程中出现错误,这可能会令人困惑 编译涉及使用常量,因为错误消息 可能指的是
    2
    ,而不是
    SIZE
    。如果
    尺寸
    为
    def