c tricks
do ... while (0)
A trick (idiom) used to correctly define macros with multiple lines / containing if.
// wrong
define FOO statement1; statement2;
// we want both statements are controlled by if, but this will left statement2 always be run.
if (cond) FOO; // if (cond) statement1; statement2;
// correct way with do...while(0)
define FOO do {statement1; statement2;} while(0);cpp
Just using {...} is also wrong, but ({...}) is OK.
// another wrong way
define FOO {statement1; statement2;}
// note the last ;, it breaks the if-else and will throw compile error!
if (cond) FOO; // if (cond) {statement1; statement2;};
else ...;
// another correct way (recommended!)
define FOO ({statement1; statement2;})cpp
Playing with #define
// variable
define X 100
// func
define ADD(x, y) (x + y)
// stringfy: #
define PQSR(x) printf("square of" x "is %d\n", (x) * (x))
int y = 2;
PQSR(y); // "square of y is 4"
// concat: ##
define XN(n) x##n
define PXN(n) printf("x"n" = %d\n", x##n)
int XN(1) = 1; // int x1 = 1;
PXN(1); // printf("x1 = %d\n", x1);
// multi-line: do while(0)
define M(x, y) do { \
\
stmt1; \
\
stmt2; \
\
} while(0)
// example
PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) {
define _REG_FUNC(funname) m.def(#funname, &funname)
_REG_FUNC(sample_grid);
_REG_FUNC(sample_grid_backward);
undef _REG_FUNC
}cpp
static
General meaning: only initialized once.
-
Static global variable / function:
Only visible inside the file it is declared in.
-
Static class variable / function:
The member belongs to the class itself, instead of its instantiations.
class A { public: static int x = 0; } int main() { A a, b; a.x = 1; cout << b.x << endl; // 1 }cpp -
Static local variable inside function:
Retains value between function calls.
int foo() { static int x = 0; // preserved in all function calls cout << x << endl; } int main() { for(int i = 0; i < 3; i++) foo(); // 0, 1, 2 }cpp