C언어/잡학사전

[C언어] AIX 서버에서 char 타입 사용 시 반드시 주의할 점

아무일도없었다 2024. 7. 9. 22:40

 

C 개발을 하다 보면 char 타입의 변수로 return 값을 받을 일이 생긴다.

 

예를 들면 아래와 같은 코드다.

#include <stdio.h>

char testFunction() {
	char ret;
    
	...
    
	if(err > 0) {
		return -1;
	}

	return ret;
}

int main() {
	char a;
    
	a = testFunction();
	if(a == -1) {
		printf("Error !!\n");
	}
    
	return 0;
}

 

겉보기에는 아무 문제없어 보이지만 AIX 서버에서 위의 코드를 실행하면 엄청난 문제가 발생한다.

 

C는 기본으로 변수 타입을 선언하면 signed로 선언이 되며 이는 생략가능하다고 본능적(?)으로 알고 있을 것이다.

 

하지만 AIX 서버는 char 타입에 대해서 기본 unsigned로 선언이 된다.

 

다시 말해 AIX 서버의 char 타입에는 기본으로 음수값이 절대 들어갈 수 없다는 뜻이다.

 

따라서 위의 예시코드에서 Error !! 라는 출력 메시지는 절대 볼 수가 없다.

 

더 쉬운 예시를 들면 아래와 같다.

 

#include <stdio.h>


int main() {
	char a;

	a = -1;
	if(a == -1) {
		printf("a is -1\n");
	}

	return 0;
}

 

위의 코드는 얼핏 보면 출력이 나올 거 같지만 aix 서버에서는 조용한 코드가 된다.

 


[해결방안]

 

 

이를 해결하기 위해서는 xlc의 옵션 -qchar 또는 #pragma chars를 사용하라고 나와있다.


>> 참고

 

Character types

Character types fall into the following categories: Narrow character types: char signed char unsigned char Wide character type wchar_t The char specifier is an integral type. The wchar_t type specifier is an integral type that has enough storage to represe

www.ibm.com

 

하지만 gcc를 사용해서 컴파일을 한다면 어떻게 해야 할까?

 

우선 -qchar에 해당하는 옵션을 찾는 게 제일 좋아 보이지만 아직 못 찾았다... (알고 계신 분은 댓글 부탁드리겠습니다.)

 > #pragma chars도 아직 확인을 못해봤는데 추후에 해 볼 예정이다. (안돼는것을 확인)

 

두 번째는 gcc 옵션이 아닌 경우 떠오르는 방법은 char를 그냥 short이나 int로 변경하는 방법이다.

 

하지만 모든 코드를 위의 방법으로 하기에는 너무 많은 리스크가 있다.

 

마지막으로 떠오른 방법은 char를 signed char로 모두 변경해서 명시적으로 signed 타입을 선언하는 방법이다.

 

가장 리스크가 적을 것으로 예상되는데 너무 귀찮은 일이 아닐 수 없다...

 


 

[결론]

 

 AIX (IBM)은 이해할 수가 없다...

속도 때문에 그런 건가..?

예전 signed와 unsigned의 속도차이에 관련한 글을 봤었는데 기억이 가물가물...

 

아무튼 aix의 char는 unsigned char와 동일하다.

반응형