user-0 提问: 声明与定义本质 

回复:
user: user-1
content: 引用 14 楼 luoxuechengbing 的回复:   何必拘泥于这些。。      声明就是告诉编译器，我这里有这么个东西，别给我报错；定义是告诉编译器，给大爷开好内存，我要仍数据进去的。

user: user-2
content: 这是定义

user: user-3
content: 引用 11 楼 zhao4zhong1 的回复:计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）……  前面是不要加上   模拟电路-->数字电路  呢

user: user-4
content: #include <stdio.h>  void putfun();//声明  int main() { 	putfun(); 	return 0; }  void putfun()//定义 { 	printf("ok\n"); }

user: user-5
content: 一下引用至The C Program Language： 如果将下列语句放在所有函数的外部：         int sp；         double val[MAXVAL]; 那么这两条语句将定义外部变量sp与val，并为之分配存储单元，同时这两条语句还可以作为该源文件中其余部分的声明。而下面的两行语句：          extern int sp；          extern double val[]; 为源文件的其余部分声明了一个int类型的外部变量sp以及一个double数组类型的外部变量val（该数组长度在其他地方确定），但这个两个声明并没有建立变量或为他们分配存储单元。  楼上大部分说的都挺对的！

user: user-6
content: 引用 7 楼 wenbo228228 的回复:i是声明，j是声明+定义，我只知道答案，还请高手解析一下  i真心不是声明, 它是定义, 不过它定义的是弱符号(没有非0初始值), 编译器发现多个同类型的弱符号时随便选一个链接到目标文件里(所有弱符号的初值一样是0, 随机选不影响程序行为), 从这点看全局的 int i;有点像声明, 但它的确是定义. 关于强弱符号规则6楼讲的很清楚了.

user: user-0
content: 引用 14 楼 luoxuechengbing 的回复:   何必拘泥于这些。。      声明就是告诉编译器，我这里有这么个东西，别给我报错；定义是告诉编译器，给大爷开好内存，我要仍数据进去的。 只有搞定了这个几十个头文件和源文件共用变量的问题才不会搞错

user: user-0
content: 引用 17 楼 bojie5744 的回复:声明与定义  探究下去还是要看汇编的原理。在C上谈论，各种说法都是差异的。 看来还要学汇编？这玩意儿难不难？

user: user-7
content: 11 楼 zhao4zhong1 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）

user: user-7
content: 声明与定义  探究下去还是要看汇编的原理。在C上谈论，各种说法都是差异的。

user: user-8
content: 引用 7 楼 wenbo228228 的回复:i是声明，j是声明+定义，我只知道答案，还请高手解析一下 这是在哪里看到的答案？

user: user-9
content: 说起来比较复杂，这个帖子也许有用 http://bbs.csdn.net/topics/310185558#post-311828474  全局变量的简单方法就是在头文件里只声明变量， 然后集中在一个文件里定义（如果必要的话赋予初始值）   /**  * @file        global.h  * @brief  */  #ifndef GLOBAL_H #define GLOBAL_H   extern int x_not_init; extern int y_init_to_20;  #endif /* GLOBAL_H */    /**  * @file        global.c  * @brief  */  #include "global.h"  int x_not_init; int y_init_to_20 = 20;     /**  * @file        main.c  * @brief  */  #include <stdio.h>  #include "global.h"  int main(int argc, char *argv[]) {          printf("x_not_init = %d\n", x_not_init);         printf("y_init_to_20 = %d\n", y_init_to_20);          return 0; }

user: user-10
content: 定义一定是申明， 申明未必是定义。  这里都是定义，也都是申明。

user: user-11
content: 看有没分配内存

user: user-12
content: 研读gcc相关片断？

user: user-13
content: 定义和声明有区别的。 1 从内存分配上说，定义分配内存， 而声明不分配内存。 2 还要求上下文联系的看， 不能只看一处的外表； #include <stdio.h>  int num;  int main( void ) { 	printf( "%d\n", num ); }  static int num = 1;   可能由于static原因 ，首句是定义， 而末句也是定义，重复定义。。

user: user-14
content: 这里涉及 弱符号与强符号 的问题  多个目标文件中含有相同名字全局符号的定义，那么这些目标文件链接的时候将会出现符号重复定义的错误。 比如我们在目标文件A和目标文件B都定义了一个全局整形变量global，并将他们都初始化，那么链接器将A 和B进行链接时会报错。 这种符号的定义可以被成为强符号（Strong Symbol)。有些符号的定义可以被称为弱符号（Weak Symbol)。 对于C/C++语言来说，编译器默认函数和初始化了的全局变量为强符号，未初始化的全局变量为弱符号。 通过GCC的"__attribute__((weak))"可以定义任何一个强符号为弱符号。 强符号和弱符号都是针对定义来说的，不是针对符号的引用。         1 extern int ext;                                                                                                   2        3 int weak;       4 int strong = 1;       5 __attribute__((weak)) int weak2 = 2;       6        7 int main(void)       8 {       9     return 0;      10 }  上段程序中，"weak"和"weak2"是弱符号，"strong"和"main"都是强符号，而"ext"既非弱符号也非强符号，因为它是 一个外部变量的引用（强符号和弱符号都是针对定义而言的）。 这对强弱的概念，链接器就会按如下规则处理与选择被多次定义的全局符号：  （1）不允许强符号多次被定义（即不同的目标文件不能有相同的强符号）；如果有多个强符号定义，则链接器报符号重复定义错误。 （2）如果一个符号在某个目标文件中是强符号，在其它文件中都是弱符号，那么选择强符号。 （3）如果一个符号在所有目标文件中都是弱符号，那么选择其中占用空间最大的一个。比如目标文件A定义全局变量global为int型， 占4个字节；目标文件B定义global为double型，占8个字节，那么目标文件A和B链接后，符号global占8个字节（尽可能不要使用多个 不同类型的弱符号，否则容易导致很难发现的程序错误）。

user: user-15
content: 编译要这样做，是因为c/c++是基于单元式的编译，然后最后链接。

user: user-16
content: 何必拘泥于这些。。      声明就是告诉编译器，我这里有这么个东西，别给我报错；定义是告诉编译器，给大爷开好内存，我要仍数据进去的。

user: user-17
content: 我正好也遇到这个问题。以下引自ANSI C89 " A declaration of an identifier for an object that has file scope without an initializer, and without a storage-class specifier or with the storage-class specifier static , constitutes a tentative definition.  If a translation unit contains one or more tentative definitions for an identifier, and the translation unit contains no external definition for that identifier, then the behavior is exactly as if the translation unit contains a file scope declaration of that identifier, with the composite type as of the end of the translation unit, with an initializer equal to 0."     按标准的意思，语句：  int a; static int a;  都是“临时性定义”。但为何程序#1：  #include <stdio.h>  int num;  int main( void ) { 	printf( "%d\n", num ); }  static int num = 1;  在编译阶段提示重定义，而程序#2：  #include <stdio.h>  static int num;  int main( void ) { 	printf( "%d\n", num ); }  int num = 1;  却能通过编译呢？