一些code.cpp文件包含
extern const int v1;
extern const int v2;
extern const int v3;
extern const int v4;
int _tmain(int argc, _TCHAR* argv[])
{
int aee = v1;
switch (aee)
{
case v1:
break;
case v2:
break;
case v3:
break;
case v4:
break;
}
return
}
Run Code Online (Sandbox Code Playgroud)
另一个文件definition.cpp包含
const int v1 = 1;
const int v2 = 2;
const int v3 = 3;
const int v4 = 4;
Run Code Online (Sandbox Code Playgroud)
当我编译时,我得到错误C2051:case表达式不是常数但是当我删除extern一切都很好.
有没有办法让它与extern一起工作?
我只是浏览gcc源文件.在gcc.c,我发现了类似的东西
extern int main (int, char **);
int
main (int argc, char **argv)
{
Run Code Online (Sandbox Code Playgroud)
现在我的疑问是extern告诉编译器特定的函数不在这个文件中,但是会在项目的其他地方找到.但是在这里,定义main是在extern声明之后立即.extern宣言服务的目的是什么?
看起来,在这个具体的例子中, extern似乎表现得像export我们在汇编中使用的那样,我们在模块之外输出一个特定的符号
有任何想法吗?
在我们的产品中,我们有称为"服务"的东西,它们是产品不同部分之间的基本交流方式(尤其是语言之间 - 内部语言,C,Python和.NET).
目前,代码是这样的(Services.Execute利用params object[] args):
myString = (string)Services.Execute("service_name", arg1, arg2, ...);
Run Code Online (Sandbox Code Playgroud)
我更愿意能够编写这样的代码并获得类型检查和更简洁的代码的好处:
myString = ServiceName(arg1, arg2, ...);
Run Code Online (Sandbox Code Playgroud)
这可以通过一个简单的功能来实现,
public static string ServiceName(int arg1, Entity arg2, ...)
{
return (string)Services.Execute("service_name", arg1, arg2, ...);
}
Run Code Online (Sandbox Code Playgroud)
但这是相当冗长的,并且在执行大量服务时并不那么容易管理,正如我打算做的那样.
看看如何extern和DllImportAttribute工作,我希望有可能通过这样的方式来解决这个问题:
[ServiceImport("service_name")]
public static extern string ServiceName(int arg1, Entity arg2, ...);
Run Code Online (Sandbox Code Playgroud)
但我根本不知道如何实现这一点,似乎无法找到任何文档(extern似乎是一个相当模糊的定义问题).我发现最接近的是一个有点相关的问题,如何为.NET中的extern方法提供自定义实现?无论如何,这并没有真正回答我的问题而且有些不同.C#语言规范(特别是在4.0版,第10.6.7节,外部方法中)没有帮助.
所以,我想提供外部方法的自定义实现; 这可以实现吗?如果是这样,怎么样?
clang,gcc和VS2013都抱怨重新定义win main(),但是我在标准中找不到任何禁止它的东西.
namespace N {
extern int j;
int j;
}
int main()
{
extern int w;
int w;
}
Run Code Online (Sandbox Code Playgroud)
这些段落说明了extern在块作用域中使用声明,但它们似乎不能证明错误消息是正确的:
§3.3.1/ 4
给定一个声明区域中的一组声明,......
[注意:这些限制适用于引入名称的声明性区域,该名称不一定与声明发生的区域相同.特别是,详细类型说明符(7.1.6.3)和友元声明(11.3)可能会将一个(可能不可见)名称引入封闭的名称空间中; 这些限制适用于该地区.本地extern声明(3.5)可能会在声明出现的声明区域中引入一个名称,并在一个封闭的命名空间中引入一个(可能不可见)名称 ; 这些限制适用于这两个地区. - 尾注]
§3.3.2/ 10
[注意:Friend声明引用的函数或类是最近的封闭命名空间的成员,但它们不会在该命名空间中引入新名称(7.3.1.2).块作用域中的函数声明和使用块作用域中的extern说明符的变量声明引用作为封闭命名空间成员的声明,但它们不会在该作用域中引入新名称. - 尾注]
我经历了两个问题,
这两个问题以不同的方式说明了这两件事.
问题1的答案: extern
问题2的答案: extern
我需要知道以下内容.
2.默认情况下,全局变量在范围(或)中是静态的,它等同于通过指定静态存储类来声明变量吗?
3.如果有任何c或c ++差异请澄清?
当我在两个不同的源文件中声明一个全局变量并且只在其中一个源文件中定义它时,我得到的C++编译结果与C相比不同.请参阅以下示例:
#include <stdio.h>
#include "func.h" // only contains declaration of void print();
int def_var = 10;
int main() {
printf("%d\n", def_var);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
#include <stdio.h>
#include "func.h"
/* extern */int def_var; // extern needed for C++ but not for C?
void print() {
printf("%d\n", def_var);
}
Run Code Online (Sandbox Code Playgroud)
我用以下命令编译:
gcc/g++ -c main.c -o main.o
gcc/g++ -c func.c -o func.o
gcc/g++ main.o func.o -o main
Run Code Online (Sandbox Code Playgroud)
g ++/clang ++抱怨multiple definition of def_var(这是我预期的行为,不使用extern时).gcc/clang编译得很好.(使用gcc 7.3.1和clang 5.0)
根据这个链接:
暂定定义是一种可能或可能不作为定义的声明.如果在同一翻译单元中较早或较晚发现实际的外部定义,则暂定定义仅作为声明.
所以我的变量 …
我正在开发一款游戏并且有一个有趣的问题.我有一些游戏范围的常量值,我想在一个文件中实现.现在我有这样的事情:
constants.cpp
extern const int BEGINNING_HEALTH = 10;
extern const int BEGINNING_MANA = 5;
Run Code Online (Sandbox Code Playgroud)
constants.hpp
extern const int BEGINNING_HEALTH;
extern const int BEGINNING_MANA;
Run Code Online (Sandbox Code Playgroud)
然后文件只是#include"constants.hpp"这很好用,直到我需要使用其中一个常量作为模板参数,因为外部链接的常量不是有效的模板参数.所以我的问题是,实现这些常量的最佳方法是什么?我担心简单地将常量放在头文件中会导致在每个翻译单元中定义它们.而且我不想使用宏.
谢谢
我有以下源代码,我感兴趣.
#include <stdio.h>
extern int foo;
int foo = 32;
int main()
{
printf("%d", foo);
}
Run Code Online (Sandbox Code Playgroud)
这是一段非常正常的代码,当我编译它时
gcc -Wall -Wextra -pedantic foo.c
Run Code Online (Sandbox Code Playgroud)
我没有得到任何警告.
这似乎很奇怪,因为变量既被定义为外部变量又被定义为同一文件中的全局变量.我很确定链接器很容易在同一个文件中找到外部变量的引用,但它看起来不像编码错误吗?如果是这样,为什么编译器不会对此发出警告?
我问自己为什么以下代码有效以及说明符extern在实例化时的作用baz_instance:
struct baz {
int value;
};
extern const baz baz_instance = {3};
template<baz const& b>
int foo(){
return b.value;
}
int main(){
foo<baz_instance>();
return 1;
}
Run Code Online (Sandbox Code Playgroud)
为什么上面的代码首先编译,如果extern省略说明符,为什么不编译?什么是extern符在这个例子吗?