VC++ 에서 Enumeration 크기 지정하는 법.

parrier의 이미지

일반적으로 VC++로 컴파일하게 되면 Enumeration으로 4byte가 할당되게 됩니다.

헌데 ARM Compiler는 해당 내용에 맞게 1,2,4(bytes)로 바뀌게 되지요.

enumeration 선언을 다음과 같이 한다면

typedef enum {
a,
b,
c,
d
}

이것을 VC++에서 컴파일한다고 했을 때, 1,2,4byte로 컴파일하려고 한다면 어떤

방법 or 편법을 쓸 수 있을까요?

codefish의 이미지

그런 기능은 없는 걸로 알고 ARM이 sizeof(enum)을 4byte로 만드는게 나을 거 같네요

ADS 1.2의 ADS_CompilerGuide_D.pdf 화일을 보시면
Controlling implementation details 챕터에서
-fy
This option forces all enumerations to be stored in integers. This option
is switched off by default and the smallest data type is used that can hold
the values of all enumerators

-fy를 주시면 됩니다

parrier의 이미지

ARM 쪽에는 손을 댈 수가 없구요. C++로는 편법으로 크기를 정하는 방법이 있던데

// FixedEnum.h
// By James M. Curran
template
class FixedEnum
{
SizeType fe;
public:
FixedEnum(Enum e): fe(static_cast(e)) {}
FixedEnum(): fe(static_cast(Enum())) {}

operator Enum() const { return static_cast(fe);}
SizeType asNative() {return fe;}
};

#include "FixedEnum.h"
#include
using std::cout;
using std::endl;

enum count {zero, one, two, three, four, thousand=1000};
FixedEnum counter;
// should be 1 byte & work like an enum.

int main(int argc, char* argv[])
{
counter = two;

cout << "Counter is " << sizeof(counter) << "byte(s) long, with a value of"
cout << counter << endl;

// counter = 5;
// would cause compile-time error.
counter = thousand; // warning - works, but not with expected result
}

-------------------------------------------------------------------------------
위와 같이 되어 있습니다만, 제 C++을 몰라서 C로 어떻게 고쳐야 할 지, 또 위 구문이 C문법으로 고치는 것이

가능한지 모르겠네요 ;.;

-_-v

neogeo의 이미지

#ifdef 1BYTE 
  typedef ENUM_X unsigned char;
#elif 2BYTE
  typedef ENUM_X unsigned short;
#else
  typedef ENUM_X unsigned int ;
#endif
 
typedef enum{
A, /* use it by enum_a */
B, /* use it by enum_b */
C, /* use it by enum_c */
D  /* use it by enum_d */
} __X;
 
#define enum_a ((ENUM_X)A);
#define enum_b ((ENUM_X)B);
#define enum_c ((ENUM_X)C);
#define enum_d ((ENUM_X)D);
 
#endif

잘 될지는 저도 의문입니다. -_-;

type 으로 쓸때는 ENUM_X

value 로 쓸때는 enum_a ~ enum_d;

Neogeo - Future is Now.

lifthrasiir의 이미지

C++ enum 확장을 쓰시면 될 것 같습니다. (제가 당장 VC++를 쓸 환경이 안 되기 때문에 확인은 못 하겠군요.) C 모드에서는 지원하지 않는다는 걸 유의하시고... 문법은 중괄호 시작 앞에 클래스 상속과 같이 ": int" 같은 걸 넣는 방법입니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.