- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我无法理解为什么这不起作用。
extern int i;
int main()
{
printf(" %d ", i);
}
static int i =3;
此外,这不起作用:
extern int i;
static int i =3;
int main()
{
printf(" %d ", i);
}
但是如果 static
变量是在 extern 声明
之前定义的,它会起作用:
static int i =3;
extern int i;
int main()
{
printf(" %d ", i);
}
据我所知,extern int i
告诉我 i
出现在其他地方,这里看起来像(int i
)
但是,其他地方意味着:
1) 也许,稍后指向作为全局变量
的相同
翻译单元。
2) 也许,在一些other
翻译单元中。
我在想即使 static int i = 3
将 i
的范围限制在当前,(1)
也是有效的定义它的翻译单元。
这里不是 static int i =3
global
(我的意思是至少它在翻译单元中是可见的)即使它的翻译单元的范围有限?那为什么编译器找不到它呢?
当我编译前两个版本时,出现以下编译时错误:
error: static declaration of ‘i’ follows non-static declaration
note: previous declaration of ‘i’ was here
我无法理解此错误消息。另外,为什么它提示它是一个静态的 declaration
难道它不是一个 definition
吗?
最佳答案
C11 6.2.2 标识符的链接第 4 节
For an identifier declared with the storage-class specifier extern in a scope in which a prior declaration of that identifier is visible,31) if the prior declaration specifies internal or external linkage, the linkage of the identifier at the later declaration is the same as the linkage specified at the prior declaration. If no prior declaration is visible, or if the prior declaration specifies no linkage, then the identifier has external linkage.
所以第二个声明将在第一个声明之后,回到您的示例,第一个和第二个示例 i
将有一个 extern
存储类。编译器认为这是一个错误。
而在第 3 个示例中,i
将是 static
,因为 static
首先显示。那应该没问题。
并且,在 C11 的第 7 节 6.2.2 标识符的链接
If, within a translation unit, the same identifier appears with both internal and external linkage, the behavior is undefined.
所以最好不要在同一个翻译单元中用static
和extern
声明同一个变量。
关于c - 翻译单元中 `static` 定义和 `extern declaration` 的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18142148/
这段代码是否正确? extern "C" extern int x; // 1 extern extern "C" int y; // 2 extern "C" extern
根据 C++ Primer ,我们可以为定义为 extern 的变量提供初始化程序,但这样做会覆盖 extern。具有初始值设定项的 extern 是一个定义: extern double pi =
使用 Cuda 5.0、VS2010 这个项目在 VS2012 中编译和链接很好,但是 VS2012 不支持 Nsight 调试所以我也在 VS2010 中开发。所以我有一个 VS2010 项目文件,
这个问题已经有答案了: How do I use extern to share variables between source files? (19 个回答) Different compilat
我正在编写供 C 程序使用的 C++ 共享库。但是,我对 extern 和 extern "C" 有疑问。 考虑以下代码 我的头文件是这样的: #ifdef __cplusplus
我对整个 header 使用 extern "C" 说明符,还是为每个函数指定 extern 有区别吗? 据我所知,没有,因为只有函数和变量可以外部链接,所以当我在每个函数原型(prototype)和
这个问题在这里已经有了答案: What is the effect of extern "C" in C++? (17 个答案) 关闭 7 年前。 我见过 C/C++ 代码使用在函数签名中声明的 e
所以我使用 svn:externals 来检查一个外部仓库。外部仓库有自己的 svn-externals 设置。 现在,当更新我的项目的工作副本时,来自外部存储库的文件正在更新,但它的外部文件没有。该
是否可以忽略 svn:externals 属性中引用的标记的外部依赖性?这听起来像是一个很奇怪的问题,但让我解释一下...... 我收集了大量独立的“可插入”代码模块,每个模块都可以作为独立项目进行独
我见过 2 种创建全局变量的方法,有什么区别,什么时候使用它们? //.h extern NSString * const MyConstant; //.m NSString * const MyCo
我在 test 模块下通过 stripe api 在 stripe 中创建了一个帐户。并与该账户绑定(bind)一个银行账户。转到 Stripe dashboard -> connect -> acc
我在下面有一个代码。它是由 qemu 程序(一个 C 程序)使用 dlopen 加载的动态共享库的一部分。 extern "C" { extern uint64_t host_virt_offset;
C++ Primer 第 5 版第 60 页讨论了如何跨文件共享 const 变量 //file_1.cc extern const int bufSize = fcn(); //file_1.h e
这个 Unresolved external 问题有什么问题?我正在尝试将其实现到我的 MFC 应用程序的 InitInstance 中。但是我从调试器中收到此行错误。 LNK2019: unreso
在 C++ 中,extern(后面不跟语言链接字符串文字)似乎对命名空间范围 (Difference between declaration of function with extern and w
假设我有 3 个文件:file1.c、file2.c 和 globals.h。 file1.c 和 file2.c 都包含 globals.h。 file1.c 包含 file2.c 需要使用的结构。
我正在为具有 16 位安装程序的旧 CD-ROM 游戏编写新的安装程序,安装程序需要在硬盘上并且能够从原始光盘复制文件。如果所有游戏文件都打包在安装程序中,我已经设置了一个可以安装游戏的脚本,这适合个
在编译我的代码时,我收到此错误。 1>MSVCRTD.lib(crtexe.obj):错误 LNK2019:函数 ___tmainCRTStartup 中引用了未解析的外部符号 _main1>C:\U
我试图将 cimg 库包装在 c++/clr 中,当我尝试构建它时,我遇到了一堆链接错误。 Error 20 error LNK2028: unresolved token (0A0002AC)
我一直遇到这两个错误,但我似乎找不到有效的解决方案。 LNK1120: 1 unresolved externals Error 1 error LNK2019: unresolved externa
我是一名优秀的程序员,十分优秀!