당신이 경험 한 최악의 실제 매크로 / 전 처리기 남용은 무엇입니까?

무엇이입니다 최악의 실제 매크로 / 사전 – 프로세서는 (IOCCC 답변 * 하하 *을 고안없는하시기 바랍니다)를 건너 어느 한 학대?

재미있는 내용이라면 짧은 스 니펫이나 스토리를 추가하십시오. 사람들에게 항상 “매크로를 사용하지 마십시오”라고 말하는 대신 무언가를 가르치는 것이 목표입니다.


추신 : 나는 전에 매크로를 사용했지만 … 실제로 솔루션이있을 때 (실제 솔루션이 인라인 되었더라도 매크로와 유사하게 됨) 결국 매크로를 제거합니다.


보너스 : 매크로가 매크로가 아닌 솔루션보다 실제로 더 나은 예를 들어보십시오.

관련 질문 : C ++ 매크로는 언제 유익합니까?



답변

메모리에서 다음과 같이 보였습니다.

#define RETURN(result) return (result);}

int myfunction1(args) {
    int x = 0;
    // do something
    RETURN(x)

int myfunction2(args) {
    int y = 0;
    // do something
    RETURN(y)

int myfunction3(args) {
    int z = 0;
    // do something
    RETURN(z)

예, 맞습니다. 어떤 기능에도 닫는 괄호가 없습니다. 구문 강조는 혼란 스러웠으므로 vi를 사용하여 편집했습니다 (vim이 아니라 구문 색상이 있습니다).

그는 주로 어셈블리 언어로 일한 러시아 프로그래머였습니다. 그는 이전에 메모리가 매우 제한된 시스템에서 작업했기 때문에 가능한 한 많은 바이트를 절약하는 것에 열광적이었습니다. “위성에 대한 것이 었습니다. 바이트 수가 매우 적기 때문에 각 바이트를 여러 가지 용도로 사용합니다.” (비트 피들 링, 숫자 값으로 기계 명령 바이트 재사용) 어떤 종류의 위성을 찾으려고했을 때, “궤도 위성을 만들었습니다. 궤도를 만들기 위해”

그는 또 다른 두 가지 단점이 있었다. “누가보고 있는지 알기 위해”모니터 위에 볼록한 거울이 있었고, 가끔 의자에서 갑자기 10 번 팔 굽혀 펴기를하기 위해 갑자기 빠져 나갔다. 그는이 마지막 내용을 “컴파일러가 코드에서 오류를 발견했습니다. 이것은 처벌입니다”라고 설명했습니다.


답변

내 최악 :

#define InterlockedIncrement(x) (x)++
#define InterlockedDecrement(x) (x)--

일부 바보는 이것을 헤더 파일에 넣었 기 때문에 이틀 동안 평생 멀티 스레드 COM 참조 계산 문제를 추적했습니다. 당시 내가 일했던 회사는 언급하지 않겠습니다.

이 이야기의 도덕? 무언가를 이해하지 못하면 문서를 읽고 그것에 대해 배우십시오. 그냥 버리지 마십시오.


답변

#define ever (;;)
for ever {
   ...
}

답변

#include <iostream>
#define System S s;s
#define public
#define static
#define void int
#define main(x) main()
struct F{void println(char* s){std::cout << s << std::endl;}};
struct S{F out;};

public static void main(String[] args) {
  System.out.println("Hello World!");
}

도전 과제 : 더 적은 수의 정의와 구조체로 누구나 할 수 있습니까? 😉


답변

#define private public

답변

#define if while

누군가에게 농담을했고, 영향을받은 사람들에 의해 재미있는 것이 발견되지 않았습니다.


답변

끔찍한 :

#define begin {
#define end }
/* and so on */

진심으로, 파스칼로 코딩하려면 파스칼 컴파일러를 구입하고 아름다운 C 언어를 파괴하지 마십시오.