a.cpp
const unsigned char whatever[123] = { /* ... */ };
Run Code Online (Sandbox Code Playgroud)
啊
extern const unsigned char whatever[123];
Run Code Online (Sandbox Code Playgroud)
b.cpp
#include "a.h"
unsigned char x = whatever[0];
// error: undefined reference to 'whatever'
Run Code Online (Sandbox Code Playgroud)
为什么我会收到未定义的引用错误?如果没有const,错误就会消失.
如何在多个翻译单元之间共享常量数组?
我在VC++ 2008中的程序有问题.当我编译它时,会列出以下错误.我花了很多时间在groups.google.com上查找原因,但没有评论帮助我.有人知道问题是什么吗?谢谢.
error LNK2001: unresolved external symbol "long rfl_xref_id" (?rfl_xref_id@@3JA)
error LNK2001: unresolved external symbol "struct obj_name * pat_objname_list" (?pat_objname_list@@3PAUobj_name@@A)
error LNK2001: unresolved external symbol "struct obj_name * pat_recall_objname_list" (?pat_recall_objname_list@@3PAUobj_name@@A)
error LNK2001: unresolved external symbol "wchar_t * rfl_unresolved_xref_tag" (?rfl_unresolved_xref_tag@@3PA_WA)
error LNK2001: unresolved external symbol "struct ref_pages * rfl_pages" (?rfl_pages@@3PAUref_pages@@A)
error LNK2001: unresolved external symbol "short rfl_use_regen_id" (?rfl_use_regen_id@@3FA)
error LNK2001: unresolved external symbol "long rfl_regen_id" (?rfl_regen_id@@3JA)
error LNK2001: unresolved external symbol "unsigned short rfl_list_status" (?rfl_list_status@@3GA)
error LNK2001: unresolved external symbol "unsigned …Run Code Online (Sandbox Code Playgroud) ISO 98/03标准(第14.3.1节)似乎禁止使用具有内部链接的类型作为模板参数.(参见下面的示例.)C++ 11标准没有.G ++ - 使用旧标准 - 允许它.我误读了03标准,还是g ++只是让这个幻灯片?
namespace
{
struct hidden { };
}
template<typename T>
struct S
{
T t;
};
int main()
{
S<hidden> s;
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我最近阅读了Stroustrups The C++ Programming Language,在第9章的关于Linkage的部分中,我遇到了以下段落:
"在C和较旧的C++程序中,关键字static(混淆)用于表示"使用内部链接".除了函数和类之外,不要使用静态."
问题是,进一步阅读,作者没有详细说明为什么这是不好的做法.我经常在我的代码中使用静态函数进行一些简单的计算,这在编译单元之外是不需要的,但是我从来没有意识到这是不赞成的,而且我不明白为什么它是坏的.有人可以为我解释这个吗?
在C89中,static关键字是否影响范围?
我的软件负责人告诉我:
"在文件顶部标记为static的变量在技术上不再具有全局范围.静态是范围限定符以及存储关键字.范围是一个涵盖符号可见性的概念,尽管可见性自动编译为具有存储持续时间本质上与几乎所有语言相关.我的意思是你不能命名一个范围,它也没有定义C/C++中的存储持续时间.表达式范围不是用户定义的,而是由C/C++涵盖的-param和r-param块作用域在C/C++中完全是词汇用户定义的主体函数作用域在C/C++中完全是词汇用户定义的主体和声明文件作用域在技术上并不存在于C/C++中,因为全局和模块作用域取决于词典模块范围是在C/C++中使用static定义的关键字,其他范围词典更改访问规则但可见性仍然基于模块全局范围是C/C++中的默认值,当没有其他范围适用且由词法控制时e xtern关键字问题是static不是作为关键字的范围限定符.它是范围限定符和内存关键字."
我糊涂了.我一直认为静态与翻译单元之间的可见性和变量的存储持续时间有关.两者都与范围无关.这不是这种情况吗?C++中的静态/范围关系是否不同?
我想知道为什么你不能在2个不同的.cpp文件中声明一个具有相同名称的全局.我的理解是考虑范围,它应该只对特定的.cpp文件可见,而不是其他地方,但它显然是在抱怨.我这样做的原因是代码中的通用性,就是这样.有任何想法吗?
编辑清晰度
a.cpp
int g_x;
b.cpp
int g_x;
据我所知,C++中的变量有三种可能的链接值 - 没有链接,内部链接和外部链接.
因此,外部链接意味着可以在多个文件中访问变量标识符,而内部链接意味着可以在同一文件中访问它.但内部联系的重点是什么?为什么不只有两个可能的标识符链接 - 没有链接和外部链接?对我来说,似乎全局(或文件)范围和内部链接起着同样的作用.
是否存在内部链接实际上有用且未被全局范围覆盖的用例?
在下面的例子中,我有两段代码 - 第一段链接到static int i11(有内部链接),第二段没有.两者都做了同样的事情,因为main已经可以访问变量i11,因为它的文件范围很大.那么为什么要有一个叫做内部联系的单独链接
static int i11 = 10;
int main()
{
extern int i11;
cout << ::i11;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
给出了相同的结果
static int i11 = 10;
int main()
{
cout << ::i11;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编辑:为了增加更多的清晰度,根据HolyBlackCat的定义,内部链接实际上意味着你可以在同一个翻译单元中转发声明一个变量.但是为什么你甚至需要为文件中已经全局访问的变量做到这一点..这个功能有什么用例吗?
如果我用静态声明全局变量,我有一个疑问.
static int a=5;
main()
{
func();
}
Run Code Online (Sandbox Code Playgroud)
可以使用extern在另一个file2.c中访问吗?
func()
{
extern int a;
printf(a);
}
Run Code Online (Sandbox Code Playgroud)
或者只使用extern来声明没有静态声明的全局变量?
假设代码:
extern int foo(void);
static int foo(void)
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
尝试使用GCC进行编译
$ gcc -Wall -std=c99 1.c
1.c:3:12: error: static declaration of ‘foo’ follows non-static declaration
1.c:1:12: note: previous declaration of ‘foo’ was here
1.c:3:12: warning: ‘foo’ defined but not used [-Wunused-function]
Run Code Online (Sandbox Code Playgroud)
那么,我该如何声明静态函数呢?
我已经读过全局变量和静态全局变量之间的区别在于全局变量可以通过extern在另一个实现文件中引用,而静态全局变量仅局限于该实现文件.看到这两个问题,以了解更多信息:[ 1,2 ].
据我了解,这是指下列foo()和bar()应相同链接.这两个功能只能用于MyClass.
//MyClass.h
Class MyClass{
private:
static void foo();
};
//MyClass.cpp
void MyClass::foo(){}
static void bar(){}
Run Code Online (Sandbox Code Playgroud)
我可以看到foo()声明更常见,因为它让头文件更完整地布局整个类(即使你不能/不应该使用私有的东西),但是不好的做法声明一个类似的函数bar()(隐藏自头文件)?
对于上下文,我定义了一个WNDPROC需要静态工作的Windows消息,但这是一个相当丑陋的声明,我不确定是否应该将它完全隐藏在实现文件中,或者继续在头文件中声明它.