在C中,我没有注意到extern函数声明之前使用的关键字的任何影响.起初,我认为extern int f();在单个文件中定义时会强制您在文件范围之外实现它.但是我发现两者都是:
extern int f();
int f() {return 0;}
Run Code Online (Sandbox Code Playgroud)
和
extern int f() {return 0;}
Run Code Online (Sandbox Code Playgroud)
编译得很好,没有gcc的警告.我用过gcc -Wall -ansi; 它甚至不接受//评论.
extern 在函数定义之前使用是否有任何影响?或者它只是一个可选的关键字,对函数没有副作用.
在后一种情况下,我不明白为什么标准设计师选择用多余的关键词来乱丢语法.
编辑:澄清一下,我知道extern变量的用法,但我只是extern在函数中询问.
我正在尝试找到一个标准的宏来测试头文件是编译为C还是C++.这样做的目的是标题可以包含在C或C++代码中,并且必须根据具体情况略有不同.特别:
在C中,我需要这个代码:
extern size_t insert (const char*);
Run Code Online (Sandbox Code Playgroud)
在C++中,我需要这个代码:
extern "C" size_t insert (const char*);
Run Code Online (Sandbox Code Playgroud)
另外,有没有办法避免在标题中的每个声明周围放置#ifdef?
当我在两个不同的源文件中声明一个全局变量并且只在其中一个源文件中定义它时,我得到的C++编译结果与C相比不同.请参阅以下示例:
#include <stdio.h>
#include "func.h" // only contains declaration of void print();
int def_var = 10;
int main() {
printf("%d\n", def_var);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
#include <stdio.h>
#include "func.h"
/* extern */int def_var; // extern needed for C++ but not for C?
void print() {
printf("%d\n", def_var);
}
Run Code Online (Sandbox Code Playgroud)
我用以下命令编译:
gcc/g++ -c main.c -o main.o
gcc/g++ -c func.c -o func.o
gcc/g++ main.o func.o -o main
Run Code Online (Sandbox Code Playgroud)
g ++/clang ++抱怨multiple definition of def_var(这是我预期的行为,不使用extern时).gcc/clang编译得很好.(使用gcc 7.3.1和clang 5.0)
根据这个链接:
暂定定义是一种可能或可能不作为定义的声明.如果在同一翻译单元中较早或较晚发现实际的外部定义,则暂定定义仅作为声明.
所以我的变量 …