문제

어젯밤에 C로 질문을 받았는데 대학 이후로 C를 많이 사용해본 적이 없어서 답을 몰랐기 때문에 그냥 잊어버리는 게 아니라 여기서 답을 찾을 수 있지 않을까 생각했습니다.

사람이 다음과 같은 정의를 가지고 있는 경우:

#define count 1

그 사람이 변수 이름을 찾을 수 있을까요? count 그 안에 있는 1을 사용하나요?

나는 카운트가 1을 가리킬 것이라고 생각했지만 1이 어떻게 다시 카운트를 가리킬 수 있는지 알지 못하기 때문에 그렇게 생각하지 않았습니다.

도움이 되었습니까?

해결책

간단한 대답은 그들이 할 수 없다는 것입니다. #이와 같은 정의는 사전 처리기가 다루고 있으며, 한 방향으로 만 지적합니다. 물론 다른 문제는 컴파일러조차도 알지 못한다는 것입니다. "1"이 무엇이든 지적 할 수 있으므로 여러 변수가 동시에 동일한 값을 가질 수 있습니다.

다른 팁

@cade roux의 답변을 바탕으로 전처리기 #define을 사용하여 값을 기호와 연결하면 전처리 기가 실행되면 코드는 기호에 대한 참조가 없습니다.

#define COUNT (1)
...
int myVar = COUNT;
...

전처리기가 실행 된 후 :

...
int myVar = (1);
...

다른 사람들이 언급했듯이, 이것은 기본적으로 위의 이유 때문에 "아니오"를 의미합니다.

그 사람이 내부에있는 1을 사용하여 변수 이름 "수"를 찾을 수 있습니까?

아니

나보다 더 웅변적이고 정통한 사람이 #define'd가 소스에 컴파일되지 않았다는 것을 지적 할 것이라고 확신하기 때문에, 당신이 가진 것은 소스를 통과하고 'count의 모든 인스턴스를 변경하는 사전 프로세서 매크로입니다. ''1 '으로 찾습니다.

그러나 C는 기계 코드에 대한 컴파일 된 언어이기 때문에 Java 또는 C#과 같은 언어로 반영과 내성을 갖지 못할 것입니다. 소스/컴파일러 주변에 프레임 워크가없는 한 멋진 작업을 수행하지 않는 한 모든 이름 지정은 편집 후 손실됩니다.

희망 이것 도움이됩니다. (실례를 실례합니다)

불행히도 이것은 불가능합니다.

#define 진술은 사전 처리기에 대한 지침, 모든 인스턴스입니다. count 교체됩니다 1. 런타임에는 관련 메모리 위치가 없습니다 count, 따라서 노력은 분명히 무의미합니다.

변수를 사용하더라도 편집 후 프로그램에 사용 된 원래 식별자의 잔재물이 없습니다. 이것은 일반적으로 동적 언어에서만 가능합니다.

C에 사용 된 한 가지 트릭은 매크로에서 # 구문을 사용하여 매크로 매개 변수의 문자열 문자를 얻는 것입니다.

#define displayInt(val) printf("%s: %d\n",#val,val)
#define displayFloat(val) printf("%s: %d\n",#val,val)
#define displayString(val) printf("%s: %s\n",#val,val)

int main(){
  int foo=123;
  float bar=456.789;
  char thud[]="this is a string";

  displayInt(foo);
  displayFloat(bar);
  displayString(thud);

  return 0;
}

출력은 다음과 비슷해 보일 것입니다.

foo: 123
bar: 456.789
thud: this is a string

#define count 1 변수 나 구조 필드의 이름을 지정하지 못하므로 매우 나쁜 생각입니다. count.

예를 들어:

void copyString(char* dst, const char* src, size_t count) {
   ...
}

당신의 count 매크로는 변수 이름을 대체합니다. 1,이 기능이 컴파일되는 것을 방지 :

void copyString(char* dst, const char* src, size_t 1) {
   ...
}

C 정의는 변수가 아닌 사전 프로세서 지침입니다. 사전 프로세서는 C 파일을 거쳐 컴파일하기 전에 정의한 내용으로 작성한 위치를 교체합니다. 이 사전 프로세서 지침의 특히 깨달은 사용에 대해서는 난독 화 된 C 컨테스트 항목을 살펴보십시오.

요점은 '1'값을 가리키는 '계산'이 없다는 것입니다. 단순한/찾기 교체 작업이 발생합니다. ~ 전에 코드는 실제로 컴파일됩니다.

실제로 C가 수정하도록 실제로 알고있는 사람을 위해이 편집 가능성을 남겨 둘 것입니다.

count 변수가 아닙니다. 스토리지가 할당되지 않았으며 기호 테이블에 항목이 없습니다. 소스 코드를 컴파일러에 전달하기 전에 전처리기로 교체되는 매크로입니다.

당신이 올바른 질문을하지 않을 가능성이 높으면, 매크로를 사용하여 이름을 얻는 방법이 있습니다.

#define SHOW(sym) (printf(#sym " = %d\n", sym))
#define count 1

SHOW(count); // prints "count = 1"

그만큼 # 연산자는 매크로 인수를 문자열 문자로 변환합니다.

#define 사전 프로세서 지침이므로 "변수"가 아닙니다.

당신이 가진 것은 실제로 변수가 없으며, 사전 처리기 지침입니다. 코드를 컴파일하면 사전 처리기가 통과하여 해당 파일의 'count'라는 단어의 모든 인스케이터를 1로 교체합니다.

내가 알고 있는지 물어볼 수도 있습니다. 1 카운트 포인트를 찾을 수 있습니까? 아니요. 변수 이름과 값 사이의 관계는 격의가 아니기 때문에 뒤로 돌아 가지 않습니다. 고려하다

int count = 1;
int count2 = 1;

완벽하게 합법적이지만 1은 무엇을 해결해야합니까?

일반적으로 아니요.

첫째, #define은 변수가 아니며 컴파일러 사전 처리기 매크로입니다.

컴파일러의 기본 단계가 작동 할 때까지 이름이 값으로 바뀌었고, "count"라는 이름은 컴파일 된 코드의 어느 곳에서나 존재하지 않습니다.

변수의 경우 런타임시 C 코드에서 변수 이름을 찾을 수 없습니다. 그 정보는 유지되지 않습니다. Java 또는 C#과 같은 언어와 달리 C는 메타 데이터를 전혀 유지하지 않습니다.

"#"로 시작하는 지침은 프리 프로세서에서 처리하여 코드를 '실제'컴파일러로 전달하기 전에 텍스트 대체를 수행합니다. 따라서 COUNT라는 변수가 없으며 코드의 모든 "COUNT"문자열이 마술처럼 "1"문자열로 대체되는 것처럼 보입니다.

따라서 그 "변수"를 찾을 방법이 없습니다.

매크로의 경우 이것은 사전 처리되고 결과 출력이 컴파일됩니다. 따라서 전처리자가 그의 작업을 피운 후에 그 이름을 찾을 수있는 방법은 전혀 없습니다. 결과 파일은 파일의 모든 곳에서 'count'대신 '1'을 포함하기 때문입니다.

그래서 대답은 아니오입니다.

그들이 C 소스 코드 (디버거에있을 것임)를보고 있다면, 그들은 다음과 같은 것을 볼 수 있습니다.

int i = count;

그 시점에서 그들은 다시 검색하고 줄을 찾을 수 있습니다

#define count 1

그러나 그들이 가지고있는 모든 것이 가변적 인 idontond what를 알고 있고, 그것을 contans 1을 볼 수 있다면, 그것을 'count'로 다시 추적 할 수있는 방법이 없습니다.

왜요? #Define은 전처리 시간에 평가되기 때문에 편집 전에 발생합니다 (거의 모든 사람에게는 편집의 첫 번째 단계로 볼 수 있음). 결과적으로 소스 코드는 그것이 존재한다는 것을 아는 것과 같이 'count'에 대한 정보가있는 유일한 것입니다. 컴파일러가 살펴볼 때까지 '카운트'에 대한 모든 참조는 숫자 '1'로 대체되었습니다.

포인터가 아니라 단지 문자열/토큰 대체 일뿐입니다. 사전 처리기는 코드가 컴파일하기 전에 모든 #defines를 대체합니다. 대부분의 컴파일러에는 선행 코드를 방출하기위한 -E 또는 유사한 인수가 포함되어 있으므로 모든 #Directives가 처리 된 후 코드의 모습을 볼 수 있습니다.

귀하의 질문에 직접적으로, 토큰이 코드로 대체되고 있음을 알 수있는 방법은 없습니다. 코드는 (count == 1)과 (1 == 1)의 차이를 알 수 없습니다.

실제로 그렇게하려면 Diff 도구를 사용하는 소스 파일 텍스트 분석을 사용하여 가능할 수 있습니다.

"찾기"란 무엇을 의미합니까?

라인

#define count 1

값이 1인 기호 "count"를 정의합니다.

컴파일 프로세스의 첫 번째 단계(전처리라고 함)에서는 다음과 같은 경우에 발생하는 모든 기호 수를 1로 바꿉니다.

if (x > count) ...

다음으로 대체됩니다:

if (x > 1) ...

이것을 얻으면 왜 "횟수 찾기"가 의미가 없는지 알 수 있습니다.

질문을 묻는 사람 (인터뷰 질문 이었습니까?)은 #define 상수와 열거를 사용하는 것을 구별하려고 시도했을 수 있습니다. 예를 들어:

#define ZERO 0
#define ONE 1
#define TWO 2

vs

enum {
  ZERO,
  ONE,
  TWO
};

주어진 코드 :

x = TWO;

#defines 대신 열거를 사용하는 경우 일부 디버거는 숫자 값 2 대신 상징적 인 값의 두 가지를 보여줄 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top