全局变量是C static还是extern默认?
如果全局变量默认是静态的,那么它意味着我们可以在单个文件中访问它们,但我们也可以在不同的文件中使用全局变量.
这是否意味着默认情况下它们具有外部存储?
如何在C中创建外部字符数组?
我已经尝试了各种方法来定义,char cmdval[128]但它总是说undefined reference to 'cmdval'
我想在cmdval中放一个字符串在first.c文件中,并在其他second.c文件中使用它.我尝试添加一个但没有运气的global.h文件extern char cmdval[128].
更新:
global.h
extern char cmdval[128];
Run Code Online (Sandbox Code Playgroud)
first.c
#include "global.h"
char cmdval[128];
function(){
strcpy(cmdval, "a string");
}
Run Code Online (Sandbox Code Playgroud)
second.c
#include "global.h"
function(){
printf("%s \n",cmdval); //error
}
Run Code Online (Sandbox Code Playgroud)
失败:("未定义参考`cmdval'"
编辑:我在linux工作(编辑一个迷你OS xv6然后在qemu编译和运行它),我不知道它是否是一个障碍
我正在尝试在C中实现树算法.我在头文件中声明了一个完全独立的外部结构(b_tree_ds.h).现在我打算在所有想要使用这个结构的源文件中导入该文件.所以我必须在头文件中使用extern声明它.
现在问题是我想要定义它的typedef.编译器给出了多个存储类的错误.我该怎么做
typedef extern struct node {
struct node* left;
struct node* right;
int key; // contains value
}NODE;
Run Code Online (Sandbox Code Playgroud)
实际问题如下,我仍然无法解决??? 我最近学会了如何使用带头文件的多个源文件来使代码可移植和分层.为了做到这一点,我厌倦了使用这个主体创建我的树程序.这是我的文件
b_tree_ds.h - 这将包含树节点的数据结构声明,可以调用实现树的不同功能的各种函数(可以在不同的源文件中)
typedef struct node {
struct node* left;
struct node* right;
int key; // contains value
}NODE;
Run Code Online (Sandbox Code Playgroud)
当我尝试在typedef中添加extern时,extern struct node它会给出多个存储类的错误,但如果我错过它,我会得到多个定义的错误.
这是我的其他源文件
traverse.h - 包含遍历函数的声明
void traverse_print (NODE* p);
Run Code Online (Sandbox Code Playgroud)
这里我也得到了未知标识符NODE的错误
traverse.c - 包含该函数的定义
#include <stdio.h>
#include "b_tree_ds.h"
#include "traverse.h"
void traverse_print(NODE* p)
{
if(p->left != NULL)
{
traverse_print(p->left);
}
if (p->right != NULL)
{ …Run Code Online (Sandbox Code Playgroud) 作为一个低级程序员,我经常使用可执行文件的模块启动代码,所以我很清楚像"crt0"这样的代码是如何工作的.当编写C++代码,我通常声明main为extern "C"以匹配C启动代码会做打电话main.因此我通常使用此声明main(wmain如果专门针对Windows):
extern "C" int main(int argv, const char *const *argv)
extern "C" int __cdecl wmain(int argv, const wchar_t *const *argv)
Run Code Online (Sandbox Code Playgroud)
它是合法使用extern "C"的main?此外,const char *const *argv的类型是合法的,而不是char *[]?
在我看来,即使我在另一个带有extern声明的文件中引用一个函数,gcc仍然可以编译该单元.所以我想知道extern声明是否在函数的任何地方都是必要的?我知道你需要extern变量.
我必须链接两个库,比如A和B.一些文件在两个库中都很常见.所以,我在命名空间中声明库A中的函数,比如说abc.因此,在A和B中,函数func如下所示:
[ in A]
namespace abc {
extern "C" void func();
}
[in B]
extern "C" void func();
Run Code Online (Sandbox Code Playgroud)
在构建项目时,编译器抛出链接错误,说明函数func的多个定义.不是命名空间内的A中的函数func,还是extern"C"函数存在一些问题.如果有,那我怎么能区分它们呢?
我很难理解'extern'是如何工作的.我搜索过谷歌,但似乎没有我正在尝试的具体案例
如果我有一个文件main.cpp引用one.h并且在其中我有一个名为LIST1的列表(这是一个100 x 100的双数组)所以我有两个List1 [100] [100];
我怎么能在one.cpp中使用这个列表?
extern double LIST1[100][100]
Run Code Online (Sandbox Code Playgroud)
不管用 :/
main.cpp中:
#include "one.h"
extern double LIST1[100][100];
Run Code Online (Sandbox Code Playgroud)
one.cpp:
void one::useList()
{
for(j = 0; j < 100; j++)
{
for(i = 0; i < 100; i++)
{
LIST1[j,i] = 0.5;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我所拥有的.
我得到的错误:
1> main.obj:错误LNK2001:未解析的外部符号"double(*LIST1)[100]"(?LIST1 @@ 3PAY0GE @ NA)
我在C文件中定义了一个变量:int x我知道extern int x如果我想在其他文件中使用它,我应该用它来在其他文件中声明它.
我的问题是:我应该在其他文件中将其声明在哪里?
在所有功能之外,
// in file a.c:
int x;
// in file b.c:
extern int x;
void foo() { printf("%d\n", x); }
Run Code Online (Sandbox Code Playgroud)在将使用它的功能内?
// in file b.c:
void foo() {
extern int x;
printf("%d\n", x);
}
Run Code Online (Sandbox Code Playgroud)我的怀疑是:
标准是否允许以下内容?
#include <iostream>
extern int a;
auto a = 3;
int main(int, char**)
{
std::cout << a << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我正在编写一个c ++库,它公开了一些仅由C#代码使用的函数.但是,由于我意外地错误输入了参数,我发现只要我不在cpp文件中使用(没有错误的版本)函数,即使没有任何警告,也可以成功编译和链接此代码.
struct Dummy { int a; double b; };
extern "C" void SetArray(Dummy* x, int cnt);
void SetArray(Dummy x, int cnt)
{
// a TODO placeholder.
}
Run Code Online (Sandbox Code Playgroud)
如何让编译器为这种情况抛出错误或警告?编译器选项-Wall已设置但仍然没有警告.使用tdmgcc 5.1.0.
extern ×10
c ×5
c++ ×5
auto ×1
c++11 ×1
char ×1
compilation ×1
declaration ×1
linkage ×1
namespaces ×1
overloading ×1
static ×1
structure ×1