相关疑难解决方法(0)

功能原型在主要或主要在C之前

C中的函数原型应该在main还是main之前.我在主教学之前就被教过,但是我的朋友课本主要用它来表示.哪种方法正确?

他的书显示:

int main()
{
    void numberTable();

    numberTable();
}

void numberTable()
{
    int num;
    ...rest of the code...
}
Run Code Online (Sandbox Code Playgroud)

c

6
推荐指数
1
解决办法
2970
查看次数

了解C中的静态存储类

static是全局变量的默认存储类.下面的两个变量(CountRoad)都有static存储类.

static int Count;
int Road;
int main()
{
    printf("%d\n", Road);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:如果默认情况下全局变量static(这意味着我们将该全局变量的范围限制为该特定.c文件)那么我们如何extern在另一个文件中使用这些变量?

这个问题对你们很多人来说可能是非常基本的,但我真的很困惑,想要了解正确的细节.

c

6
推荐指数
2
解决办法
1272
查看次数

OBJC_EXTERN:目的是什么?

您正在查看一些Objective-C代码,并发现以下声明:

OBJC_EXTERN void CLSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2);

这意味着什么?那么,这个陈述的语法应该是什么?

提前致谢

objective-c extern

5
推荐指数
1
解决办法
875
查看次数

C++ 如何正确初始化全局变量?

我正在编写一个小学生项目,并遇到了一个问题,即我有几个全局变量并且需要在几个源文件中使用它,但是我收到错误 *未定义对 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)

c++ variables global-variables

5
推荐指数
1
解决办法
1万
查看次数

我保证不被此ODR违规行为所咬伤吗?

我有一个头文件,声明一个带有静态变量的模板,并定义它:

/* 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被宣布为弱 …

c++ linker templates one-definition-rule

5
推荐指数
1
解决办法
171
查看次数

结构声明与定义

我如何声明,而不是定义一个结构,例如在多个文件之间共享的数据。我在定义原语时理解这个想法。因此,例如,我可能有:

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 相同的原则?

c struct declaration extern

5
推荐指数
1
解决办法
4851
查看次数

使用全局变量最优雅的方式是什么?

几年前,我了解到全局变量不好,应该避免。但我知道它们有时是不可避免的,至少在嵌入式系统中是这样。您认为与他们合作最优雅的方式是什么?

\n\n

在我的项目中,我有一个名为的文件globals.h,我在其中定义所有全局变量:

\n\n
#ifndef GLOBALS_H\n#define GLOBALS_H\nextern int16_t    gVariable1;\nextern int16_t    gVariable2;\n\xe2\x80\xa6.\n#endif\n
Run 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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

并且知道我将其包含globals.h在需要访问全局变量的项目的每个其他文件中。

\n\n

这很好用,但是有没有更优雅的方法来处理这个问题?

\n

c coding-style global-variables

5
推荐指数
1
解决办法
1285
查看次数

在两个模块之间共享 sizeof(array)

我想共享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)

有没有办法使这项工作?我知道为什么这不起作用,但也许有一个偷偷摸摸的技巧来解决这个问题。

c arrays linker compilation

5
推荐指数
1
解决办法
116
查看次数

GCC多次声明全局变量时没有警告或错误

假设以下代码:

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 gcc

4
推荐指数
1
解决办法
526
查看次数

C - 为全局变量显式编写 extern 关键字

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 declaration access-specifier extern

4
推荐指数
1
解决办法
791
查看次数