C 대체 토큰
1. 개요
C 대체 토큰은 C 언어에서 사용되는 특수 문자를 대체하는 매크로들을 정의하는 헤더 파일인 `iso646.h`에 의해 제공된다. 이 매크로들은 `and`, `or`, `not` 등과 같은 키워드를 사용하여 논리 연산 및 비트 연산을 수행할 수 있게 해준다. C++에서는 이러한 키워드가 이미 예약되어 있어 `iso646.h`를 포함할 필요가 없으며, C++17부터는 `
| 설명 | C 표준 라이브러리 헤더, 일반적인 연산자의 대체 스펠링 제공 |
|---|---|
| 헤더 파일 | iso646.h |
| 도입 | C95 |
| and | && (논리 AND) |
|---|---|
| and_eq | &= (비트 AND 대입) |
| bitand | & (비트 AND) |
| bitor | | (비트 OR) |
| compl | ~ (비트 NOT) |
| not | ! (논리 NOT) |
| not_eq | != (같지 않음) |
| or | || (논리 OR) |
| or_eq | |= (비트 OR 대입) |
| xor | ^ (비트 XOR) |
| xor_eq | ^= (비트 XOR 대입) |
| 조건문 | if (x bitand 1)는 if (x & 1)과 동일함 |
|---|---|
| 논리 연산 | if (not flag)는 if (!flag)와 동일함 |
| C++ | C++에서는 이러한 대체 토큰이 키워드로 직접 지원되어 iso646.h 헤더를 포함할 필요가 없음 |
|---|
| C | C95에서 도입 |
|---|
2. 매크로
`iso646.h` 헤더는 아래 표와 같이 11개의 매크로를 정의한다. 각 매크로는 연산자에 해당한다.
| 매크로 | 정의 | |
|---|---|---|
| `and` | `&&` | |
| `and_eq` | `&=` | |
| `bitand` | `&` | |
| `bitor` | ` | |
| `compl` | `~` | |
| `not` | `!` | |
| `not_eq` | `!=` | |
| `or` | ` | ` |
| `or_eq` | =` | |
| `xor` | `^` | |
| `xor_eq` | `^=` |
3. C++에서의 사용
C++에서는 `and`, `or`, `not` 등이 연산자 키워드로 이미 예약되어 있으므로, `iso646.h`를 포함할 필요가 없다. C++98 표준은 C와의 호환성을 위해 `<iso646.h>`와 `<ciso646>` 헤더를 모두 제공했지만, 이 헤더들은 실질적으로 아무런 내용도 포함하지 않았다. 일부 컴파일러(예: 마이크로소프트 비주얼 C++)는 컴파일러 플래그가 설정되어 있지 않으면 이러한 식별자를 사용하기 위해 헤더를 포함해야 했던 적이 있었다. `<ciso646>` 헤더는 C++17에서 더 이상 사용되지 않았고 C++20에서 제거되었으며, `<iso646.h>`는 C와의 호환성을 위해 유지되었다.
4. 사용 예시 (C 언어)
`iso646.h` 헤더는 아래 표와 같이 11개의 매크로를 정의한다.
| 매크로 | 정의 | |
|---|---|---|
| `and` | `&&` | |
| `and_eq` | `&=` | |
| `bitand` | `&` | |
| `bitor` | ` | |
| `compl` | `~` | |
| `not` | `!` | |
| `not_eq` | `!=` | |
| `or` | ` | ` |
| `or_eq` | =` | |
| `xor` | `^` | |
| `xor_eq` | `^=` |
ISO 646 변형 문자 집합으로 C의 기호를 기술할 수 없었던 환경에서 이 헤더를 사용했다. 그러나 현재는 UTF-8과 같은 인코딩 환경이 일반적이므로 이 헤더를 사용할 필요는 거의 없다.
4.1. 조건문
cpp
#include
#include
int main(void)
{
if(((2 + 3) == 5) and ((4 - 3) == 1))
{
puts("SUCCESS");
}
return 0;
}
```
위 코드는 `&&` 연산자 대신 `and` 매크로를 사용한 예시이다. 위 코드는 아래 코드와 동일하다.
```cpp
#include
#include
int main(void)
{
if(((2 + 3) == 5) && ((4 - 3) == 1))
{
puts("SUCCESS");
}
return 0;
}
4.2. 비트 연산
wikitextiso646.h 헤더는 비트 연산에 사용되는 매크로를 정의한다.
| 매크로 | 정의 |
|---|---|
bitand | & |
bitor | |
compl | ~ |
다음은
iso646.h를 이용한 or 연산의 예시이다.```c
#include
#include
int main(void)
{
if((1 bitor 2) == 3)
{
puts("SUCCESS");
}
return 0;
}
```
위 코드는 `|` (OR) 연산자 대신 `bitor` 매크로를 사용한 예시이다. `bitor` 부분을 `bitand`로 바꾸면 `&` (AND) 연산을 수행할 수 있다. 아래는 `bitand`를 사용한 예시이다.
```c
#include
#include
int main(void)
{
if((1 bitand 2) == 0)
{
puts("SUCCESS");
}
return 0;
}
```