10 个解决方案
#1
还有“常量折叠”是什么意思
#2
可执行程序是若干目标程序链接而成的, 每个目标文件是由对应的一个源代码文件编译而来的, 如果在A目标文件里想调用B目标文件里的函数, 就需要在A源代码里声明B中的函数, 那么链接时刻就可以完成符号的定位.
#3
老师,再请问一下详细的,举个例子
在c.cpp文件里有如下代码:
//c.cpp
#include<iostream>
using namespace std;
int f(){}
void mian(){}
这个c.cpp文件,经过编译是编译成一个目标程序吧???
#4
老师,能不能再向我说说什么是内连接,什么是外连接?
#5
一个.c .cpp为一个编译单元
内部链接就是该符号只在编译单元内有效,其他编译单元看不到。所以 多个编译单元中可有相同符号。const变量可以出现在多个.cpp文件中 而不会冲突就是因为是内部链接。
外部链接就是其他编译单元能看到当前编译单元的符号。如果有相同的外部链接符号,就会在链接时报重定义符号的错误。
内部链接就是该符号只在编译单元内有效,其他编译单元看不到。所以 多个编译单元中可有相同符号。const变量可以出现在多个.cpp文件中 而不会冲突就是因为是内部链接。
外部链接就是其他编译单元能看到当前编译单元的符号。如果有相同的外部链接符号,就会在链接时报重定义符号的错误。
#6
你可以简单理解成 const 可以在不同的cpp中重复定义
extern只能定义一个,其他的都是声明
extern只能定义一个,其他的都是声明
#7
能不能再请教一下:关于这句话的理解“通常c++编译器并不为const创建存储空间,相反它把这个定义保存在它的符号表里”。这句话是我在书上看到的。有两个疑问(1)为什么不创建存储空间,(2)符号表里怎么保存?符号表到底是装些什么东西的?
#8
这是编译器内部处理流程,不同编译器的做法可以不同,你现在没必要深究这个。
#9
请问,我在网上看说const变量内部链接被优化,不分配内存(从符号表中读),而外部链接需要分配内存。
为何外部链接需要分配内存呢?
为何外部链接需要分配内存呢?
#10
能不能再请教一下:关于这句话的理解“通常c++编译器并不为const创建存储空间,相反它把这个定义保存在它的符号表里”。这句话是我在书上看到的。有两个疑问(1)为什么不创建存储空间,(2)符号表里怎么保存?符号表到底是装些什么东西的?
一个.c .cpp为一个编译单元
内部链接就是该符号只在编译单元内有效,其他编译单元看不到。所以 多个编译单元中可有相同符号。const变量可以出现在多个.cpp文件中 而不会冲突就是因为是内部链接。
外部链接就是其他编译单元能看到当前编译单元的符号。如果有相同的外部链接符号,就会在链接时报重定义符号的错误。
这是编译器内部处理流程,不同编译器的做法可以不同,你现在没必要深究这个。
请问,我在网上看说const变量内部链接被优化,不分配内存(从符号表中读),而外部链接需要分配内存。
为何外部链接需要分配内存呢?
很认同#5 akirya的说法,刚看到这时很疑惑,看了akirya的回复后豁然开朗,然后加上自己的理解,如下:
const int num = 10 ;
这便属于内部链接,一般也只是在一个文件中(通常在头文件中最好,这样的话就必须被包含到其他.cpp文件中)有效,所以可以再多不同的文件中创建相同的const int num = 10 ;这样的命名常量而不会冲突;另外内部链接在编译期间并不为其非配内存,只是存放在了符号表中,这也是编译器优化的结果,因为如果在编译期间就为其非配内存的话,就要经过很多流程(例如类型检查等等),而放在符号表中就不需要,类型检查交给后续的操作进行
extern const int num = 10 ; //
这便属于外部链接, 一般在整个项目文件中有效,具有全局唯一性。为了确保它的全局唯一性,所以就必须在编译阶段就为其分配内存,这样的话,如果要定义其他同名的变量时,便会产生错误。
个人理解,可能有误。
#1
还有“常量折叠”是什么意思
#2
可执行程序是若干目标程序链接而成的, 每个目标文件是由对应的一个源代码文件编译而来的, 如果在A目标文件里想调用B目标文件里的函数, 就需要在A源代码里声明B中的函数, 那么链接时刻就可以完成符号的定位.
#3
可执行程序是若干目标程序链接而成的, 每个目标文件是由对应的一个源代码文件编译而来的, 如果在A目标文件里想调用B目标文件里的函数, 就需要在A源代码里声明B中的函数, 那么链接时刻就可以完成符号的定位.
老师,再请问一下详细的,举个例子
在c.cpp文件里有如下代码:
//c.cpp
#include<iostream>
using namespace std;
int f(){}
void mian(){}
这个c.cpp文件,经过编译是编译成一个目标程序吧???
#4
可执行程序是若干目标程序链接而成的, 每个目标文件是由对应的一个源代码文件编译而来的, 如果在A目标文件里想调用B目标文件里的函数, 就需要在A源代码里声明B中的函数, 那么链接时刻就可以完成符号的定位.
老师,能不能再向我说说什么是内连接,什么是外连接?
#5
一个.c .cpp为一个编译单元
内部链接就是该符号只在编译单元内有效,其他编译单元看不到。所以 多个编译单元中可有相同符号。const变量可以出现在多个.cpp文件中 而不会冲突就是因为是内部链接。
外部链接就是其他编译单元能看到当前编译单元的符号。如果有相同的外部链接符号,就会在链接时报重定义符号的错误。
内部链接就是该符号只在编译单元内有效,其他编译单元看不到。所以 多个编译单元中可有相同符号。const变量可以出现在多个.cpp文件中 而不会冲突就是因为是内部链接。
外部链接就是其他编译单元能看到当前编译单元的符号。如果有相同的外部链接符号,就会在链接时报重定义符号的错误。
#6
你可以简单理解成 const 可以在不同的cpp中重复定义
extern只能定义一个,其他的都是声明
extern只能定义一个,其他的都是声明
#7
一个.c .cpp为一个编译单元
内部链接就是该符号只在编译单元内有效,其他编译单元看不到。所以 多个编译单元中可有相同符号。const变量可以出现在多个.cpp文件中 而不会冲突就是因为是内部链接。
外部链接就是其他编译单元能看到当前编译单元的符号。如果有相同的外部链接符号,就会在链接时报重定义符号的错误。
#8
能不能再请教一下:关于这句话的理解“通常c++编译器并不为const创建存储空间,相反它把这个定义保存在它的符号表里”。这句话是我在书上看到的。有两个疑问(1)为什么不创建存储空间,(2)符号表里怎么保存?符号表到底是装些什么东西的?
一个.c .cpp为一个编译单元
内部链接就是该符号只在编译单元内有效,其他编译单元看不到。所以 多个编译单元中可有相同符号。const变量可以出现在多个.cpp文件中 而不会冲突就是因为是内部链接。
外部链接就是其他编译单元能看到当前编译单元的符号。如果有相同的外部链接符号,就会在链接时报重定义符号的错误。
这是编译器内部处理流程,不同编译器的做法可以不同,你现在没必要深究这个。
#9
请问,我在网上看说const变量内部链接被优化,不分配内存(从符号表中读),而外部链接需要分配内存。
为何外部链接需要分配内存呢?
为何外部链接需要分配内存呢?
#10
能不能再请教一下:关于这句话的理解“通常c++编译器并不为const创建存储空间,相反它把这个定义保存在它的符号表里”。这句话是我在书上看到的。有两个疑问(1)为什么不创建存储空间,(2)符号表里怎么保存?符号表到底是装些什么东西的?
一个.c .cpp为一个编译单元
内部链接就是该符号只在编译单元内有效,其他编译单元看不到。所以 多个编译单元中可有相同符号。const变量可以出现在多个.cpp文件中 而不会冲突就是因为是内部链接。
外部链接就是其他编译单元能看到当前编译单元的符号。如果有相同的外部链接符号,就会在链接时报重定义符号的错误。
这是编译器内部处理流程,不同编译器的做法可以不同,你现在没必要深究这个。
请问,我在网上看说const变量内部链接被优化,不分配内存(从符号表中读),而外部链接需要分配内存。
为何外部链接需要分配内存呢?
很认同#5 akirya的说法,刚看到这时很疑惑,看了akirya的回复后豁然开朗,然后加上自己的理解,如下:
const int num = 10 ;
这便属于内部链接,一般也只是在一个文件中(通常在头文件中最好,这样的话就必须被包含到其他.cpp文件中)有效,所以可以再多不同的文件中创建相同的const int num = 10 ;这样的命名常量而不会冲突;另外内部链接在编译期间并不为其非配内存,只是存放在了符号表中,这也是编译器优化的结果,因为如果在编译期间就为其非配内存的话,就要经过很多流程(例如类型检查等等),而放在符号表中就不需要,类型检查交给后续的操作进行
extern const int num = 10 ; //
这便属于外部链接, 一般在整个项目文件中有效,具有全局唯一性。为了确保它的全局唯一性,所以就必须在编译阶段就为其分配内存,这样的话,如果要定义其他同名的变量时,便会产生错误。
个人理解,可能有误。