AFAIK,文件范围内的变量或函数的任何声明都默认具有外部链接.static意思是"它有内部联系",extern- "它可能在其他地方定义",而不是"它有外部联系".
如果是,为什么我们需要extern关键字?换句话说,int foo;和extern int foo;(文件范围)之间的区别是什么?
我想在Linux中共享一个以上的独立C可执行文件之间的变量.也就是说,程序将在数组上写入并设置一个标志,以便其他程序不能使用它,并且在此操作之后它将取消设置标志,然后另一个程序将读取该数组.我尝试在每个程序中使用相同的自定义头文件(包含变量),但似乎在调用程序时会创建不同的变量实例.
我有一个10岁以上的C库 - 我相信 - 曾经在过去的好日子里工作得很好,但是当我尝试将它与C++源码(包含主要功能)一起使用时,有一天我遇到了有些困难.
编辑:澄清一下,C库编译得很好gcc,它会生成一个目标文件old_c_library.o.该库被认为在某种程度上,这样的C头文件中使用的old_c_library.h是#include在D main.cC源文件.然后你的主要C源文件应该编译并与old_c_library.ovia 链接在一起gcc.在这里,我想使用C++源文件main.cpp,并编译/链接它g++.
在编译C++源文件期间发生了以下三个问题:
new(它是一个整数的名称),导致致命错误; 和calloc调用(缺少显式类型转换),导致致命错误; 和编辑:我试图使用#extern "C" { #include "obsolete_c_library.h" }"技巧",如评论中所建议,但这并没有解决我的任何问题.
我可以通过重命名保留字的所有实例并用 - 基本上 - 替换它们来解决问题1.我可以通过类型化calloc调用来解决问题2 .我可能会尝试通过这里建议的想法来解决警告:如何禁用几行代码的GCC警告.
但我仍然想知道,有没有办法以优雅,高层次的方式克服这些困难,而不是真正触及原始图书馆?
我试过以下代码:
FILE1.C:
int x;
Run Code Online (Sandbox Code Playgroud)
file2.c中:
extern char x;
main()
{
x=10;
....
....
}
Run Code Online (Sandbox Code Playgroud)
编译为
$ gcc File1.c File2.c
我没有得到任何错误,但我期待一个.
我在其中一个cpp文件中有一个全局变量,我在其中为其赋值.现在为了能够在另一个cpp文件中使用它,我将其声明为,extern并且此文件具有多个使用它的函数,因此我在全局范围内执行此操作.现在,可以在其中一个函数中访问此变量的值,而不是在另一个函数中访问.除了在头文件中使用它之外的任何建议都会很好,因为我浪费了4天玩这个.
在下面的代码中,为什么多个声明(和一个定义)适用于全局变量x,而不适用y于main()函数内部的局部变量?它显示以下2个错误:
1)没有联系的'y'重新声明
2)之前的'y'声明就在这里
为什么它显示局部变量但不是全局变量的错误?不仅是我的书,而且本论坛的以下2个链接清楚地表明我们可以多次声明一个变量(尽管只定义一次).
并且请注意解释第一个错误"没有链接"的部分是什么,"没有连接的'y'的重新声明"是什么意思?什么联系和谁?将局部变量链接到哪里?
#include<stdio.h>
int x;
int x;
int x=303;
int main(void)
{
int y;
int y;
int y=776; //Works fine if above 2 declarations are removed!!
printf("The value of x is %d,and of y is %d",x,y);
}
Run Code Online (Sandbox Code Playgroud) 我经常要用10多个源文件编写c/c ++程序,其中需要在所有文件的函数之间共享少量变量.我之前已经读过,通常很好的做法是避免使用全局变量extern.但是,如果完全有必要使用全局变量,则此链接提供了一个很好的策略.最近,我一直在研究将所有变量包装在结构或类中并将此结构传递给不同函数的策略.我想知道人们认为哪种方式更清洁,以及是否有更好的选择.
编辑:我意识到两种语言的策略可能不同.我对仅适用于一种语言或两者兼有的策略感兴趣.
首先,我尝试了几乎所有在stackoverflow中给出的解决方案,但我没有成功实现全局变量,我甚至做了一步一步的教程,但我仍然得到相同的错误.
继承人的问题:
我有一个包含多个视图的程序,我想在所有视图上使用变量,所以我使用了全局变量,
我有:
GlobalVars.h
#import <UIKit/UIKit.h>
extern NSArray *truckBoxes;
extern NSArray *farmerlist;
extern NSString *farmerCardNumber;
extern NSString *fName;
@interface GlobalVars : NSObject
{
}
@end
Run Code Online (Sandbox Code Playgroud)
GlobalVars.m
#import "GlobalVars.h"
NSArray *farmerlist;
NSArray *truckBoxes;
NSString *farmerCardNumber;
NSString *fName;
@implementation GlobalVars
{
}
@end
Run Code Online (Sandbox Code Playgroud)
我将该文件包含在类中(连接到视图控制器):在我添加的.h文件下 #import "GlobalVars.h
我可以访问farmerlist和truckBoxes从应用程序,但无法访问fName或farmerCardNumber.
我可以写farmerCardNumber同一个视图并从中读取,但如果我稍后尝试从另一个视图访问它,我会得到
2013-10-26 11:11:45.612 C3Cms[10427:70b] Branch : 11558
2013-10-26 11:11:59.459 C3Cms[10427:70b] -[__NSArrayM length]: unrecognized selector sent to instance 0x8b7fbc0
2013-10-26 11:11:59.463 C3Cms[10427:70b] *** Terminating app …Run Code Online (Sandbox Code Playgroud) // case 1
unsigned int add_two_numbers(unsigned char a, unsigned char b);
//case 2
extern unsigned int add_two_numbers(unsigned char a, unsigned char b);
Run Code Online (Sandbox Code Playgroud)
案例1和案例2有什么区别?我从来没有使用extern作为函数原型,而是查看某人的代码(谁比我更有经验)我看到extern总是在声明函数原型时使用.任何人都可以指出请点差异吗?(或者指向我可以找到具体信息的链接).谷歌表示,这与外部联系有关.任何人都能指出一个例子,一个人会工作而另一个人不会吗?
我使用嵌入式C(KEIL),如果它有任何区别.
我在temp2.h中声明了一个变量i,它只
extern i; 包含一行上面的行,并创建了另一个文件temp3.c
#include<stdio.h>
#include<temp2.h>
int main ()
{
extern i;
i=6;
printf("The i is %d",i);
}
Run Code Online (Sandbox Code Playgroud)
当我在上面编译时,
cc -I ./ temp3.c 我得到了以下错误
/tmp/ccJcwZyy.o: In function `main':
temp3.c:(.text+0x6): undefined reference to `i'
temp3.c:(.text+0x10): undefined reference to `i'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我在上面的temp3.c中声明了extern,正如我在上面的文章中提到的那样,KR第33页说.我为temp3.c尝试了另一种方法,使用相同的头文件temp2.h
#include<stdio.h>
#include<temp2.h>
int main ()
{
i=6;
printf("The i is %d",i);
}
Run Code Online (Sandbox Code Playgroud)
并编译它 cc -I ./ temp3.c 并得到以下错误
/tmp/ccZZyGsL.o: In function `main':
temp3.c:(.text+0x6): undefined reference to `i'
temp3.c:(.text+0x10): undefined reference to `i'
collect2: ld returned …Run Code Online (Sandbox Code Playgroud)