It depends on how a source file, which defines the variable (generally, symbol), and a source file, which uses the variable (symbol) are compiled: as a part of the kernel module, or as a part of the kernel core (that is, built-in into kernel).
Assuming names of the source files are define-symbol.c and use-symbol.c correspondingly, you have 5 possibilities:
Both define-symbol.c and use-symbol.c are compiled into kernel core.
EXPORT_SYMBOL isn't needed.
define-symbol.c is compiled into kernel core, use-symbol.c is compiled into kernel module.
EXPORT_SYMBOL is needed.
define-symbol.c is compiled into kernel module, use-symbol.c is compiled into kernel core.
You cannot use such symbol.
define-symbol.c and use-symbol.c are compiled into the same kernel module.
EXPORT_SYMBOL isn't needed.
define-symbol.c and use-symbol.c are compiled into the different kernel modules.
EXPORT_SYMBOL is needed.
Note, that way of source compilation may depend on configuration options.
In your case, it seems you have situation 3: as net/ipv4/tcp_dctcp.c is used for built-in.o, it is part of the kernel core.
Note, that in any case variable should be declared for use it. Otherwise, it will be compile-time error, not a link one.
net/sched/sch_htb.candnet/ipv4/tcp_dctcp.c) are compiled as a part of the kernel core (that is, not as modules)? If so, noEXPORT_SYMBOLis needed. Note, that compilation of the filesched/sch_htb.cdepends onCONFIG_NET_SCH_HTBconfiguration option. If you compile it as a module, you cannot use symbol defined in it in the kernel core.