C中的函数原型应该在main还是main之前.我在主教学之前就被教过,但是我的朋友课本主要用它来表示.哪种方法正确?
他的书显示:
int main()
{
void numberTable();
numberTable();
}
void numberTable()
{
int num;
...rest of the code...
}
Run Code Online (Sandbox Code Playgroud) static是全局变量的默认存储类.下面的两个变量(Count和Road)都有static存储类.
static int Count;
int Road;
int main()
{
printf("%d\n", Road);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:如果默认情况下全局变量static(这意味着我们将该全局变量的范围限制为该特定.c文件)那么我们如何extern在另一个文件中使用这些变量?
这个问题对你们很多人来说可能是非常基本的,但我真的很困惑,想要了解正确的细节.
您正在查看一些Objective-C代码,并发现以下声明:
OBJC_EXTERN void CLSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2);
这意味着什么?那么,这个陈述的语法应该是什么?
提前致谢
我正在编写一个小学生项目,并遇到了一个问题,即我有几个全局变量并且需要在几个源文件中使用它,但是我收到错误 *未定义对 variable_name 的引用*。例如,让我们创建三个源文件:
tst1.h:
extern int global_a;
void Init();
Run Code Online (Sandbox Code Playgroud)
tst1.cpp:
#include "tst1.h"
void Init(){
global_a = 1;
}
Run Code Online (Sandbox Code Playgroud)
tst2.cpp:
#include "tst1.h"
int main(){
Init();
}
Run Code Online (Sandbox Code Playgroud)
当我编译和链接时,这就是我得到的:
$ g++ -c tst1.cpp
$ g++ -c tst2.cpp
$ g++ tst2.o tst1.o
tst1.o: In function `Init()':
tst1.cpp:(.text+0x6): undefined reference to `global_a'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
如果我删除extern语句,那么我会遇到另一个问题,让我展示一下:
$ g++ -c tst1.cpp
$ g++ -c tst2.cpp
$ g++ tst2.o tst1.o
tst1.o:(.bss+0x0): multiple definition of `global_a'
tst2.o:(.bss+0x0): first defined here
collect2: …Run Code Online (Sandbox Code Playgroud) 我有一个头文件,声明一个带有静态变量的模板,并定义它:
/* my_header.hpp */
#ifndef MY_HEADER_HPP_
#define MY_HEADER_HPP_
#include <cstdio>
template<int n>
struct foo {
static int bar;
static void dump() { printf("%d\n", bar); }
};
template<int n>
int foo<n>::bar;
#endif // MY_HEADER_HPP_
Run Code Online (Sandbox Code Playgroud)
此标头包含在main.cpp共享库中mylib.特别是,mylib_baz.hpp只需包含此模板并声明一个修改模板特化的函数.
/* mylib_baz.hpp */
#ifndef MYLIB_BAZ_HPP_
#define MYLIB_BAZ_HPP_
#include "my_header.hpp"
typedef foo<123> mylib_foo;
void init_mylib_foo();
#endif // MYLIB_BAZ_HPP_
Run Code Online (Sandbox Code Playgroud)
和
/* mylib_baz.cpp */
#include "mylib_baz.hpp"
void init_mylib_foo() {
mylib_foo::bar = 123;
mylib_foo::dump();
};
Run Code Online (Sandbox Code Playgroud)
当我生成mylib.so(包含mylib_baz.o)时,符号for foo<123>::bar存在并声明为弱.但是,我的符号for也foo<123>::bar被宣布为弱 …
我如何声明,而不是定义一个结构,例如在多个文件之间共享的数据。我在定义原语时理解这个想法。因此,例如,我可能有:
extern int myvalue; /* in shared header file */
Run Code Online (Sandbox Code Playgroud)
和
int myvalue = 5; /* in data.c file */
Run Code Online (Sandbox Code Playgroud)
但是,我如何对结构做同样的事情。例如,如果我有以下类型:
typedef struct {
size_t size;
char * strings[];
} STRLIST;
Run Code Online (Sandbox Code Playgroud)
如果我然后使用语句:
STRLIST list;
Run Code Online (Sandbox Code Playgroud)
这既是声明又是定义。那么,如何应用与使用 extern 相同的原则?
几年前,我了解到全局变量不好,应该避免。但我知道它们有时是不可避免的,至少在嵌入式系统中是这样。您认为与他们合作最优雅的方式是什么?
\n\n在我的项目中,我有一个名为的文件globals.h,我在其中定义所有全局变量:
#ifndef GLOBALS_H\n#define GLOBALS_H\nextern int16_t gVariable1;\nextern int16_t gVariable2;\n\xe2\x80\xa6.\n#endif\nRun Code Online (Sandbox Code Playgroud)\n\n在我的主项目文件中,我声明了所有全局变量:
\n\n/*\n***********************************************************************\n* global variables *\n***********************************************************************\n*/\n int16_t gVariable1 = 0;\n int16_t gVariable2 = 0;\n\n\nint16_t main (void)\n{\n gVariable1 = 6;\n\n // do other stuff\n}\nRun Code Online (Sandbox Code Playgroud)\n\n并且知道我将其包含globals.h在需要访问全局变量的项目的每个其他文件中。
这很好用,但是有没有更优雅的方法来处理这个问题?
\n我想共享sizeof(array)两个 .c 模块之间的值。该数组在文件 A 中初始化,因此编译器在编译时知道大小,然后我想在另一个 B 文件中使用该数组的大小。
示例:
在 Ac 文件中:
int arr[] = {1, 2, 3};
.
.
.
for (int i = 0; i < sizeof(arr); i++); // that works
Run Code Online (Sandbox Code Playgroud)
在 Ah 文件中:
extern int arr[];
Run Code Online (Sandbox Code Playgroud)
在 Bc 文件中:
#include "A.h"
.
.
.
for (int i = 0; i < sizeof(arr); i++); // here compiler doesn't know size of this arr
Run Code Online (Sandbox Code Playgroud)
有没有办法使这项工作?我知道为什么这不起作用,但也许有一个偷偷摸摸的技巧来解决这个问题。
假设以下代码:
AC:
#include <stdio.h>
int a;
int func();
int main(int argc, char **argv) {
a = 7;
int a2 = func();
printf("a is %d, a2 is %d\n", a, a2);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
和bc:
int a;
int func()
{
a = 9;
return a;
}
Run Code Online (Sandbox Code Playgroud)
使用g++ a.c b.c -Wall -O0它编译时会产生链接错误,如预期的那样.但是,调用gcc a.c b.c -Wall -O0它时不会产生警告而且没有错误!
输出a is 9, a2 is 9顺便说一下.
gcc版本5.4.0 20160609(Ubuntu 5.4.0-6ubuntu1~16.04.4)
GCC为什么允许这样做?我对这种行为感到惊讶.如果在声明时初始化变量,那么链接也将失败并使用GCC.
我C下面有 2 个文件。从我读到的我知道全局变量的默认存储类是 extern。如果我明确输入它,我会收到未定义的变量错误。我在这里缺少什么?这是否意味着当我省略 extern 关键字时它成为一个定义,但当我输入它时它只是一个声明?
文件1.c
#include <stdio.h>
#include <stdlib.h>
extern void file2function();
int variable; // if i put extern i will get error, isnt it implicitly extern?
int main()
{
variable = 1;
printf("file1 %d\n",variable);
file2function();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
文件2.c
#include <stdio.h>
#include <stdlib.h>
extern int variable;
void file2function(){
variable = 2;
printf("file2 %d\n",variable);
return;
}
Run Code Online (Sandbox Code Playgroud) c ×7
extern ×3
c++ ×2
declaration ×2
linker ×2
arrays ×1
coding-style ×1
compilation ×1
gcc ×1
objective-c ×1
struct ×1
templates ×1
variables ×1