Skip to content

Instantly share code, notes, and snippets.

@pyrrho
Last active May 16, 2017 20:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pyrrho/61d7625b0400095742c370a0b0284c60 to your computer and use it in GitHub Desktop.
Save pyrrho/61d7625b0400095742c370a0b0284c60 to your computer and use it in GitHub Desktop.
C++14 inline Variable Hack
#include "a.h"
#include "shared.h"
namespace A {
int & getShared() { return shared_int; }
int * getSharedAddr() { return &shared_int; };
int & getMacro() { return macro_int; }
int * getMacroAddr() { return &macro_int; }
}
namespace A {
int & getShared();
int * getSharedAddr();
int & getMacro();
int * getMacroAddr();
}
#include "b.h"
#include "shared.h"
namespace B {
int & getShared() { return shared_int; }
int * getSharedAddr() { return &shared_int; };
int & getMacro() { return macro_int; }
int * getMacroAddr() { return &macro_int; }
}
namespace B {
int & getShared();
int * getSharedAddr();
int & getMacro();
int * getMacroAddr();
}
#include <cstdio>
#include "a.h"
#include "b.h"
int main () {
printf("A::getShared() : %d\n", A::getShared()); // 4
printf("A::getSharedAddr() : %p\n", A::getSharedAddr()); // 0x106809288
printf("A::getMacro() : %d\n", A::getMacro()); // 42
printf("A::getMacroAddr() : %p\n", A::getMacroAddr()); // 0x1068092b8
printf("B::getShared() : %d\n", B::getShared()); // 4
printf("B::getSharedAddr() : %p\n", B::getSharedAddr()); // 0x106809288
printf("B::getMacro() : %d\n", B::getMacro()); // 42
printf("B::getMacroAddr() : %p\n", B::getMacroAddr()); // 0x1068092b8
printf("\n"); //
printf("A::getMacro() : %d\n", ++A::getMacro()); // 43
printf("B::getMacro() : %d\n", ++B::getMacro()); // 44
printf("A::getMacro() : %d\n", ++A::getMacro()); // 45
printf("B::getMacro() : %d\n", ++B::getMacro()); // 46
printf("A::getMacro() : %d\n", ++A::getMacro()); // 47
printf("B::getMacro() : %d\n", ++B::getMacro()); // 48
}
// To build
// clang++ -std=gnu++14 -c a.cpp -o a.o
// clang++ -std=gnu++14 -c b.cpp -o b.o
// clang++ -std=gnu++14 a.o b.o main.cpp -o main
#include <utility>
inline int & __Get_shared_int() {
static int shared_int = 4;
return shared_int;
}
static auto & shared_int = __Get_shared_int();
#define INLINE_VARIABLE(TYPE, NAME, ...) \
inline TYPE __Get_ ##NAME () { \
static std::decay<TYPE>::type NAME { __VA_ARGS__ }; \
return NAME; \
} \
static TYPE NAME = __Get_ ##NAME ()
INLINE_VARIABLE(int &, macro_int, 42);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment