340 lines
10 KiB
Markdown
340 lines
10 KiB
Markdown
---
|
|
title: Linkage
|
|
TARGET DECK: Obsidian::STEM
|
|
FILE TAGS: c17::linkage
|
|
tags:
|
|
- c17
|
|
- linkage
|
|
---
|
|
|
|
## Overview
|
|
|
|
An identifier declared in different scopes or in the same scope multiple times can be made to refer to the same object or function by a process called **linkage**. There are three kinds of linkage: **external**, **internal**, and **none**.
|
|
|
|
%%ANKI
|
|
Basic
|
|
Linkage is a property of what C construct?
|
|
Back: Identifiers.
|
|
Reference: Jens Gustedt, _Modern C_ (Shelter Island, NY: Manning Publications Co, 2020).
|
|
<!--ID: 1733010193273-->
|
|
END%%
|
|
|
|
%%ANKI
|
|
Basic
|
|
What capability does linkage allow identifiers to perform?
|
|
Back: Reference to the same object or function.
|
|
Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf).
|
|
<!--ID: 1733010193275-->
|
|
END%%
|
|
|
|
%%ANKI
|
|
Basic
|
|
What are the three kinds of linkage?
|
|
Back: External, internal, and none.
|
|
Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf).
|
|
<!--ID: 1733010193276-->
|
|
END%%
|
|
|
|
%%ANKI
|
|
Basic
|
|
External linkage denotes the same object across what?
|
|
Back: The entire program.
|
|
Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf).
|
|
<!--ID: 1733010193277-->
|
|
END%%
|
|
|
|
%%ANKI
|
|
Basic
|
|
Internal linkage denotes the same object across what?
|
|
Back: A single translation unit.
|
|
Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf).
|
|
<!--ID: 1733010193278-->
|
|
END%%
|
|
|
|
%%ANKI
|
|
Basic
|
|
What is the linkage between two different identifiers?
|
|
Back: None.
|
|
Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf).
|
|
<!--ID: 1733010193279-->
|
|
END%%
|
|
|
|
%%ANKI
|
|
Basic
|
|
Which keyword is usually associated with external linkage?
|
|
Back: `extern`
|
|
Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf).
|
|
<!--ID: 1733010193280-->
|
|
END%%
|
|
|
|
%%ANKI
|
|
Basic
|
|
What linkage does a keyword annotated with `extern` have?
|
|
Back: Internal or external.
|
|
Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf).
|
|
<!--ID: 1733010193281-->
|
|
END%%
|
|
|
|
%%ANKI
|
|
Basic
|
|
What linkage does a keyword associated with `static` have?
|
|
Back: Internal.
|
|
Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf).
|
|
<!--ID: 1733010193282-->
|
|
END%%
|
|
|
|
%%ANKI
|
|
Basic
|
|
Which keyword is usually associated with internal linkage?
|
|
Back: `static`
|
|
Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf).
|
|
<!--ID: 1733010193283-->
|
|
END%%
|
|
|
|
%%ANKI
|
|
Basic
|
|
When can an identifier have both external and internal linkage?
|
|
Back: When specified in two different translation units.
|
|
Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf).
|
|
<!--ID: 1733010193284-->
|
|
END%%
|
|
|
|
%%ANKI
|
|
Basic
|
|
Within a translation unit, what happens if an identifer has both external and internal linkage?
|
|
Back: Undefined behavior.
|
|
Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf).
|
|
<!--ID: 1733010193285-->
|
|
END%%
|
|
|
|
%%ANKI
|
|
Basic
|
|
Consider the following translation unit. What is the linkage of `x`?
|
|
```c
|
|
int x;
|
|
```
|
|
Back: External.
|
|
Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf).
|
|
<!--ID: 1733010193286-->
|
|
END%%
|
|
|
|
%%ANKI
|
|
Basic
|
|
Consider the following translation unit. What is the linkage of `foo`?
|
|
```c
|
|
void foo(void) { }
|
|
```
|
|
Back: External.
|
|
Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf).
|
|
<!--ID: 1733010193287-->
|
|
END%%
|
|
|
|
%%ANKI
|
|
Basic
|
|
What is the linkage of an object identifier with file scope and no storage-class specifier?
|
|
Back: External.
|
|
Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf).
|
|
<!--ID: 1733010193288-->
|
|
END%%
|
|
|
|
%%ANKI
|
|
Basic
|
|
*How* do you identify the linkage of an object identifier with file scope and no storage-class specifier?
|
|
Back: Its always external.
|
|
Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf).
|
|
<!--ID: 1733010193289-->
|
|
END%%
|
|
|
|
%%ANKI
|
|
Basic
|
|
What is the linkage of a function identifier with file scope and no storage-class specifier?
|
|
Back: Internal or external.
|
|
Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf).
|
|
<!--ID: 1733010193290-->
|
|
END%%
|
|
|
|
%%ANKI
|
|
Basic
|
|
Consider the following translation unit. What is the linkage of `foo`?
|
|
```c
|
|
static void foo(void);
|
|
extern void foo(void);
|
|
```
|
|
Back: Internal.
|
|
Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf).
|
|
<!--ID: 1733010193291-->
|
|
END%%
|
|
|
|
%%ANKI
|
|
Basic
|
|
Consider the following translation unit. What is the linkage of `foo`?
|
|
```c
|
|
extern void foo(void);
|
|
static void foo(void);
|
|
```
|
|
Back: N/A. Undefined behavior.
|
|
Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf).
|
|
<!--ID: 1733010193292-->
|
|
END%%
|
|
|
|
%%ANKI
|
|
Basic
|
|
Consider the following translation unit. What is the linkage of `foo`?
|
|
```c
|
|
void foo(void);
|
|
static void foo(void);
|
|
```
|
|
Back: N/A. Undefined behavior.
|
|
Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf).
|
|
<!--ID: 1733010193293-->
|
|
END%%
|
|
|
|
%%ANKI
|
|
Basic
|
|
Consider the following translation unit. What is the linkage of `foo`?
|
|
```c
|
|
void foo(void);
|
|
void foo(void);
|
|
```
|
|
Back: External.
|
|
Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf).
|
|
<!--ID: 1733010193294-->
|
|
END%%
|
|
|
|
%%ANKI
|
|
Basic
|
|
*How* do you identify the linkage of a function identifier with file scope and no storage-class specifier?
|
|
Back: Its the same as if the function identifier were declared `extern`.
|
|
Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf).
|
|
<!--ID: 1733010193295-->
|
|
END%%
|
|
|
|
%%ANKI
|
|
Basic
|
|
What is the linkage of a function parameter?
|
|
Back: None.
|
|
Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf).
|
|
<!--ID: 1733010193296-->
|
|
END%%
|
|
|
|
%%ANKI
|
|
Basic
|
|
What is the linkage of a local variable without a storage specified?
|
|
Back: None.
|
|
Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf).
|
|
<!--ID: 1733010193297-->
|
|
END%%
|
|
|
|
%%ANKI
|
|
Basic
|
|
Consider the following translation unit. What is the linkage of the last `x`?
|
|
```c
|
|
int x;
|
|
int main(void) { extern int x; }
|
|
```
|
|
Back: External.
|
|
Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf).
|
|
<!--ID: 1733010193298-->
|
|
END%%
|
|
|
|
%%ANKI
|
|
Basic
|
|
Consider the following translation unit. What is the linkage of the last `x`?
|
|
```c
|
|
int x;
|
|
int main(void) { static int x; }
|
|
```
|
|
Back: Internal.
|
|
Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf).
|
|
<!--ID: 1733010193299-->
|
|
END%%
|
|
|
|
%%ANKI
|
|
Basic
|
|
Consider the following translation unit. What is the linkage of the last `x`?
|
|
```c
|
|
extern int x;
|
|
int main(void) { static int x; }
|
|
```
|
|
Back: Internal.
|
|
Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf).
|
|
<!--ID: 1733010193300-->
|
|
END%%
|
|
|
|
%%ANKI
|
|
Basic
|
|
Consider the following translation unit. What is the linkage of the last `x`?
|
|
```c
|
|
extern int x;
|
|
int main(void) { extern int x; }
|
|
```
|
|
Back: External.
|
|
Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf).
|
|
<!--ID: 1733010193301-->
|
|
END%%
|
|
|
|
%%ANKI
|
|
Basic
|
|
Consider the following translation unit. What is the linkage of the last `x`?
|
|
```c
|
|
static int x;
|
|
extern int x;
|
|
int main(void) { extern int x; }
|
|
```
|
|
Back: Internal.
|
|
Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf).
|
|
<!--ID: 1733010193302-->
|
|
END%%
|
|
|
|
%%ANKI
|
|
Basic
|
|
Consider the following translation unit. What is the linkage of the last `x`?
|
|
```c
|
|
extern int x;
|
|
static int x;
|
|
int main(void) { extern int x; }
|
|
```
|
|
Back: N/A. Undefined behavior.
|
|
Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf).
|
|
<!--ID: 1733010193303-->
|
|
END%%
|
|
|
|
%%ANKI
|
|
Basic
|
|
Consider the following translation unit. What is the linkage of the last `x`?
|
|
```c
|
|
extern int x;
|
|
int main(void) { int x; }
|
|
```
|
|
Back: None.
|
|
Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf).
|
|
<!--ID: 1733010193304-->
|
|
END%%
|
|
|
|
%%ANKI
|
|
Basic
|
|
Consider the following translation unit. What is the linkage of the last `x`?
|
|
```c
|
|
static int x;
|
|
int main(void) { int x; }
|
|
```
|
|
Back: None.
|
|
Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf).
|
|
<!--ID: 1733010193305-->
|
|
END%%
|
|
|
|
%%ANKI
|
|
Basic
|
|
Consider the following translation unit. What is the linkage of the last `x`?
|
|
```c
|
|
void foo(int x) { }
|
|
```
|
|
Back: None.
|
|
Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf).
|
|
<!--ID: 1733010193306-->
|
|
END%%
|
|
|
|
## Bibliography
|
|
|
|
* “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf).
|
|
* Jens Gustedt, _Modern C_ (Shelter Island, NY: Manning Publications Co, 2020). |